gpt4 book ai didi

javascript - 为什么 promise 在声明时执行?

转载 作者:行者123 更新时间:2023-11-29 17:45:59 25 4
gpt4 key购买 nike

我想使用 Promise.all() 执行一组 promise 。我的做法是把这些promise放在一个数组中,然后把这个数组传给Promise.all()。但是,我发现 promise 在声明后立即开始执行,甚至不等待 Promise.all 被调用。

为什么会发生这种情况,我如何让 promise 仅在调用 Promise.all() 时执行?

let promiseArray = [];
const values = [1, 2, 3, 4, 5];

values.forEach((value)=>{
promiseArray.push(
new Promise((resolve, reject)=>{
console.log('value: ' + value);
return resolve();
})
)
})


console.log('start')
Promise.all(promiseArray)

/*
output is

value: 1
value: 2
value: 3
value: 4
value: 5
start

would have expected output to have been

start
value: 1
value: 2
value: 3
value: 4
value: 5
*/

最佳答案

将 promise 视为“执行”会让您感到困惑。 promise 纯粹是一种通知机制。它通常与某些底层异步操作相关联,当您创建 promise 时,通常会启动异步操作。

Promise.all() 然后用于跟踪您已经开始 的一大堆异步操作何时完成(或以错误结束)。

因此,您不使用 Promise.all() 来启动一堆事情。您只需使用它来跟踪它们何时全部完成以及它们何时在您的代码中的其他地方开始。


当您使用 new Promise() 手动创建 promise 时, promise 执行器会立即执行。这就是它们的设计方式。

如果您的 promise 执行器中有真正的异步操作,并且当这些操作完成时您正在执行 console.log(),您可能不会发现 promise 的设计有任何问题。我认为您的大部分困惑源于这样一个事实,即您的 promise 执行程序中实际上没有任何异步操作,因此实际上没有理由为此使用 promise。 Promises 旨在跟踪异步操作的完成情况。如果您没有实际的异步操作,则没有理由使用它们。

仅供引用,如果你想在未来某个时间从 promise 执行器内部开始一些异步操作,你可以使用普通的 setTimeout()process.nextTick()setImmediate() 操作来安排操作稍后开始。

would have expected output to have been

另外,您似乎希望您的输出具有严格的顺序。 Promise.all() 期望有 N 个异步操作并行运行,并且没有保证这 N 个操作的完成顺序。相反,Promise.all() 将跟踪所有这些,收集所有结果并按顺序向 .then() 处理程序提供一组结果(如果它们都已解决成功地)。它不会按顺序运行操作本身。这些操作并行运行,并按照它们采用的任何自然顺序完成。

关于javascript - 为什么 promise 在声明时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49685779/

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