为什么使用Promise返回正确值,async/await写法却返回undefined
两段代码返回值差异的核心原因
第一个Promise版本正常返回的原因
- 你手动在外层封装了一个自定义Promise,当
machinery.run遍历到匹配项触发eachItem回调时,你直接调用了外层Promise的resolve(item)方法,此时不管machinery.run本身的执行逻辑和返回结果是什么,外层Promise都会直接以匹配到的item作为结果完成,所以能拿到你预期的返回值。
第二个async/await版本返回undefined的原因
- 你混淆了回调函数返回值和外层方法返回值的边界:
eachItem只是你传入machinery.run的遍历处理回调,你在这个回调里return item,只会作为eachItem这个async函数本身的Promise结果,完全不会被传递为machinery.run的返回值。 - 这类遍历工具的
run方法,返回的Promise通常只会在全部遍历完成后resolve,要么resolve为undefined,要么resolve为所有eachItem回调的返回值集合,不会单独把某个匹配项的返回值作为自身的resolve结果,所以你直接await machinery.run自然拿不到目标匹配项,只会得到undefined。
符合async/await风格的修改方案
如果不想手动封装Promise,可以通过外部变量存储匹配结果的方式实现需求:
async function search(searchFor) { let matchedItem = undefined await machinery.run({ eachItem: async (item) => { if (item.someValue === searchFor) { matchedItem = item // 如果machinery.run支持提前终止遍历,可在此处调用对应的终止方法减少不必要的遍历 } } }) return matchedItem }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

