gpt4 book ai didi

javascript - 为什么我的 Promise 没有异步处理?

转载 作者:行者123 更新时间:2023-12-02 21:59:12 28 4
gpt4 key购买 nike

我有两个函数,一个函数 asyncTest_returnPromise 只是返回一个 Promise,另一个函数 asyncTest 通过在 Promise 数组上调用 Promise.all(promises) 来调用该 Promise 3 次。在数组中的每个 Promise 中,我在调用 asyncTest_returnPromise 函数之前将一个值(“Foo”)发送到控制台,并在调用该函数后将另一个值(“Bar”)发送到控制台。

根据我对 Promise.all 函数的理解,我预计数组中的每个 Promise 仅在后续 Promise 完成后才会被处理,这意味着由于两个 console.log 语句都位于数组中的每个 Promise 中,结果将是:富酒吧富酒吧富酒吧

然而,输出似乎是:富富富酒吧酒吧酒吧

由于“Foo”的所有实例甚至在第一个“Bar”之前都已发送到控制台,因此在我看来,这些 promise 必须同时处理。

这是两个函数:

function asyncTest_returnPromise() {
return new Promise((resolve, reject) => {
resolve()
})
}

function asyncTest() {
var promises = []
for (i = 0; i < 3; i++) {
promises.push(new Promise((resolve, reject) => {
console.log("Foo")
asyncTest_returnPromise().then(_ => {
console.log("Bar")
resolve();
})
}))
}
Promise.all(promises)
}

asyncTest();

所以我想知道,我是否误解了 Promise.all 的目的或者它是如何工作的?我的代码的其他部分是否在所有“bar”输出之前导致了所有“foo”输出?在继续下一个 promise 之前,我需要做些什么来完成每个 promise 的全部吗?

最佳答案

它们异步运行。

每次循环时,您:

  1. 记录 Foo
  2. 创建一个 promise (立即解决)
  3. 使用 then 将函数排队以在 Promise 解析后运行

然后循环进行下一次迭代。

之后,当asyncTest函数完成时,事件循环就可以自由地查看排队的函数。

由于所有 promise 都已解决,因此它们各自运行(并记录 Bar)。

如果您想在再次循环之前等待 promise ,那么您应该查看 the await keyword这会让 asyncTest 暂停(并进入休眠状态),直到 promise 得到解决。

关于javascript - 为什么我的 Promise 没有异步处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59931271/

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