为什么Async eachSeries中await不生效?该如何解决并实现正确逻辑?
问题原因
await仅允许在被async关键字修饰的函数内部使用,你传入async.eachSeries的迭代器是普通函数,未声明async,语法层面就不支持await生效,严格模式下会直接抛出语法错误。
- 你调用的
s3Lib.storeData是回调风格的异步函数,没有返回 Promise 实例,哪怕补充了async声明,直接await也不会等待回调执行完成,await仅能对 Promise 类型的异步任务生效。
- 你调用的
- 你当前的代码已经通过回调里调用
next()的方式实现了串行执行控制,额外加的await属于多余逻辑,反而会打乱执行时序。
- 你当前的代码已经通过回调里调用
修复方案
提供两种可直接落地的修复方式:
方案1:保留原有回调逻辑,删除多余的await
直接删掉 s3Lib.storeData 前的 await 关键字即可,原有回调+next()的逻辑已经能满足串行执行的需求,不需要额外修改其他代码:
async.eachSeries(myaccomplishmentinfo, (imgitem, next) => { let imgfilename = req.body.userid + '_' + uniqid.time() + '_' + imgitem.order; let img1_buff = Buffer.from(imgitem.filecontent, 'base64'); let data = {}; data.binaryData = img1_buff; data.folderName = 'myaccomplishments'; data.fileName = imgfilename; data.filetype = imgitem.filetype; // 删掉await即可 s3Lib.storeData(data, (res) => { myaccomplishmentimgdetail.push({ uniqueid: random, filename: imgfilename, filetype: imgitem.filetype, imagetag: imgitem.imagetag, imgorder: imgitem.order, created_at: getdbdate, modified_at: getdbdate }); console.log(res) next(); }) }, (err) => { // 建议补充全局错误回调,处理执行过程中出现的异常 if (err) console.error('执行出错:', err) })
方案2:全量适配async/await范式
如果要使用 await 写法统一异步逻辑,需要做两处修改:给迭代器函数加 async 前缀,同时把回调风格的 s3Lib.storeData 包装为 Promise 形式,此时不需要手动调用 next(),async库会自动等待Promise执行完成后进入下一轮迭代:
// 可以用node内置的util.promisify把回调方法转成返回Promise的方法 const { promisify } = require('util') const storeDataAsync = promisify(s3Lib.storeData) async.eachSeries(myaccomplishmentinfo, async (imgitem) => { let imgfilename = req.body.userid + '_' + uniqid.time() + '_' + imgitem.order; let img1_buff = Buffer.from(imgitem.filecontent, 'base64'); let data = {}; data.binaryData = img1_buff; data.folderName = 'myaccomplishments'; data.fileName = imgfilename; data.filetype = imgitem.filetype; // 直接await包装后的Promise方法 const res = await storeDataAsync(data) myaccomplishmentimgdetail.push({ uniqueid: random, filename: imgfilename, filetype: imgitem.filetype, imagetag: imgitem.imagetag, imgorder: imgitem.order, created_at: getdbdate, modified_at: getdbdate }); console.log(res) }, (err) => { if (err) console.error('执行出错:', err) })
内容的提问来源于stack exchange,提问作者Jayanthi
相关产品推荐
相关产品推荐

