You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:45:03