javascript - 为什么使用异步函数减少只返回最后一个对象
问题描述
我正在尝试为数组中的所有水果设置随机数并返回一个包含所有水果的对象,并在减速器中使用异步函数,但只返回数组的最后一个元素
(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 };
}, {})
))();
解决方案
你很亲密。主要问题是您将数组编写为[(...)]
而不是[...]
. 在您的代码中,该数组仅包含一个值,如果您删除它,()
您将拥有三个值。有关详细信息,请参阅逗号运算符。
你必须考虑的另一件事是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
将并行解决承诺(同时)
推荐阅读
- elasticsearch - Filebeat 将最新日志推送到 Kafka
- jenkins - 詹金斯失败InstallUncaughtExceptionHandler
- c# - 能够从 API 获取数据,但在 POST 数据时显示 Cors 错误
- javascript - 在这里如何正确使用数组?
- terraform - 如何使用chucklist 创建分块数组的映射?
- python - 取决于查询区域大小的值的微小差异
- xml-parsing - IllegalArgumentException:输入字节数组在 396 处的结束字节不正确。xmlStreamReader CHARACTERS 事件以错误的顺序读取字符
- mysql - 修改日期时间戳设置默认值为空而不是设置时间戳
- mongodb - 为什么我会为 mongodb.connect 收到此类型错误?
- r - 是否有一个 R 函数可以忽略 sapply 在错误时停止下载并继续下一行(Webscraping)?