首页 > 解决方案 > 为什么使用异步函数减少只返回最后一个对象

问题描述

我正在尝试为数组中的所有水果设置随机数并返回一个包含所有水果的对象,并在减速器中使用异步函数,但只返回数组的最后一个元素

(async () =>
  console.log(
    await [("apple", "banana", "orange")].reduce(async (o, fruit) => {
      const random_number = await new Promise((resolve) => setTimeout(() => resolve(Math.random()), 200));
      return { ...o, [fruit]: random_number };
    }, {})
  ))();

标签: javascript

解决方案


你很亲密。主要问题是您将数组编写为[(...)]而不是[...]. 在您的代码中,该数组仅包含一个值,如果您删除它,()您将拥有三个值。有关详细信息,请参阅逗号运算符

你必须考虑的另一件事是async函数总是返回一个承诺,所以你也必须await o-

(async () =>
  console.log(
    await ["apple", "banana", "orange"].reduce(async (o, fruit) => {
      const rand = new Promise((resolve) => setTimeout(() => resolve(Math.random()), 200))
      return { ...await o, [fruit]: await rand }
    }, {})
  ))();

{
  "apple": 0.8731611352383968,
  "banana": 0.163521266739585,
  "orange": 0.8419246752641664
}

上面使用的注释reduce将按顺序(按顺序)解决promise。其他评论建议map->Promise.all将并行解决承诺(同时)


推荐阅读