gpt4 book ai didi

javascript - map() 与 async 与 promise.all()

转载 作者:行者123 更新时间:2023-12-05 00:34:41 25 4
gpt4 key购买 nike

如果我有一个元素数组并且我想对它们进行并行操作。
我会使用 promise.all() .

我知道promise.all()接受一系列 promise 。如果我错了,请纠正我,我不这么认为。
Here ,它清楚地说。

The Promise.all() method returns a single Promise that fulfills when all of the promises passed as an iterable have been fulfilled or when the iterable contains no promises or when the iterable contains promises that have been fulfilled and non-promises that have been returned. It rejects with the reason of the first promise that rejects, or with the error caught by the first argument if that argument has caught an error inside it using try/catch/throw blocks.



所以,是的,我们可以将简单的函数传递给 promise.all() ,如果它们返回则解决,如果它们抛出错误则拒绝。
现在看看下面的代码。
const promises = todayAssignedJobs.map(async todayAssigned => {
const [leaderboard, created] = await Leaderboard.findOrCreate({...});

if (!created) {
const rating = (todayAssigned.rating + leaderboard.rating * leaderboard.jobs_completed) / (leaderboard.jobs_completed + 1);
const commission = todayAssigned.commission + leaderboard.commission;
const jobsCompleted = leaderboard.jobs_completed + 1;

await Leaderboard.update({
rating,
commission,
jobs_completed: jobsCompleted,
updated_by: 'system',
}, {
where: {
id: leaderboard.id,
},
});
}

await AssignedJob.update({
is_leaderboard_generated: true,
}, {
where: {
id: todayAssigned.id,
},
});
});

await Promise.all(promises);

在这里,我有一个疑问。
我们正在迭代数组的每个元素并对它们进行异步操作。他们没有明确返回任何东西。
所以,我认为 map 也在这里做并行操作。
为什么要使用 promise.all()这里?

最佳答案

.map()没有 promise 意识。所以,当你传递一个 async像你一样回调,它不会关注返回的 promise 。因此,它只是一个接一个地运行循环,而不是等待任何返回的 promise 。因此,所有异步操作都在 .map() 中开始。循环将同时进行。

如果这是你想要的,并且你想收集所有返回的 Promise,以便稍后查看它们何时全部完成 Promise.all() ,那么这种模式效果很好:

Promise.all(someArray.map(callbackThatReturnsAPromiseHere))

而且,这是它的常见设计模式。事实上,Bluebird Promise 库有一个特殊的函数,它结合了这两个函数,叫做 Promise.map()。 .它还提供了另一个不错的功能,可以让您控制一次可以运行多少并发异步操作(因为它的 map() 操作是 promise 感知的)。

听起来您想弄清楚是否应该只使用 .map()并且不使用 Promise.all() .如果这样做,您将并行运行异步操作,但您不知道它们何时全部完成,也不知道收集所有结果的能力。您将使用 Promise.all()在返回的 Promise 数组上,以了解它们何时全部完成和/或收集它们的已解决结果。

仅供引用, .map()只是一个普通的循环。它没有任何特殊的异步功能或任何特殊的并行运行功能。你可以用 for 做同样的事情如果你愿意,可以循环。它不会为您的 async 暂停回调以等待它完成,因此运行它的副作用是您启动了一堆并行异步操作。

关于javascript - map() 与 async 与 promise.all(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61379705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com