Gulp:任务报错时如何让parallel并行构建流程继续执行
错误原因
你当前的错误捕获逻辑不生效,是因为 rss-to-json 的 parse 方法返回的是 Promise 异步对象,外层的同步 try/catch 只能捕获函数执行时的同步报错,无法捕获 Promise 抛出的异步异常,因此错误会向上冒泡到 Gulp 调度层,导致整个构建终止。
修正方案
方案1:给Promise添加catch回调
直接在现有Promise链后补充catch块捕获错误,同时按照Gulp任务规范调用回调函数通知任务完成即可:
// RSS to JSON const { parse } = require('rss-to-json'); const fs = require('fs'); function parseRss(cb) { parse('https://feeds.buzzsprout.com/1794525.rss') .then(rss => { fs.writeFileSync('./site/_data/podcast.json', JSON.stringify(rss, null, 3)); cb(); // 通知Gulp任务执行成功 }) .catch(e => { console.log('RSS拉取失败,跳过该步骤,错误信息:', e.message); cb(); // 捕获错误后正常通知任务结束,不传错误参数Gulp会判定任务成功 }); }
方案2:改用async/await写法(更易读)
将任务改为async函数,内部用try/catch可以同时捕获同步和异步错误:
// RSS to JSON const { parse } = require('rss-to-json'); const fs = require('fs/promises'); // 改用promise版fs更符合异步编码习惯 async function parseRss() { try { const rss = await parse('https://feeds.buzzsprout.com/1794525.rss'); await fs.writeFile('./site/_data/podcast.json', JSON.stringify(rss, null, 3)); } catch(e) { console.log('RSS拉取失败,跳过该步骤,错误信息:', e.message); // 不需要额外抛出错误,Gulp会默认async函数执行完成即任务成功 } }
注意事项
不要在错误捕获块中向上抛出错误,也不要给回调函数cb传入错误参数,否则Gulp仍然会判定任务失败,终止整个构建流程。如果有需要,你也可以在catch块中添加兜底逻辑,比如拉取失败时直接使用本地缓存的历史JSON文件。
内容的提问来源于stack exchange,提问作者Jon Persson
相关产品推荐
相关产品推荐

