首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的承诺不异步处理?

为什么我的承诺不异步处理?
EN

Stack Overflow用户
提问于 2020-01-27 12:33:01
回答 2查看 53关注 0票数 0

我有两个函数,一个函数,asyncTest_returnPromise只返回一个诺言,另一个函数,asyncTest,通过调用承诺数组中的Promise.all(承诺)调用3次。在数组中的每个承诺中,在调用asyncTest_returnPromise函数之前,我向控制台发送一个值("Foo"),并在调用后将另一个值("Bar")发送到控制台。

考虑到我对Promise.all函数的理解,我希望数组中的每个承诺只有在实现了随后的承诺之后才会被处理,这意味着由于两个console.log语句都在数组中的每个承诺中,结果将是:

相反,输出似乎是: Foo Bar Bar

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

以下是两个功能:

代码语言:javascript
复制
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”输出?在进入下一个承诺之前,我需要做些什么来完成所有的承诺吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-27 12:47:49

这就是事件循环的工作原理。让我用简单的词来解释它是如何处理的

  1. 首先,循环启动并运行3次。每次它创建一个新的微任务,并将其放入微任务队列中,以供以后处理。创建这些微任务的顺序保持不变。
  2. 现在这些微任务一次一个地被同步地处理。每个微任务(在循环运行时同步运行)执行console.log('Foo');,然后创建另一个由.then()调用排队的微任务(另一个承诺)。因此,这个额外的微任务被放入队列中(在这三个最初的微任务后面)。它会发生在每个由循环创建的微任务(所以它是3次)。这是Foo打印3次的地方。
  3. 现在我们的所有微任务(3)都已经处理完毕,事件循环继续运行,并接受下一个微任务进行处理。这一次是一个运行console.log('Bar');的微任务。这也发生了三次。这里是Bar打印3次的地方。

当然,在Event循环中会发生更多的事情,但本质上这就是您在这里的承诺所发生的事情。

票数 0
EN

Stack Overflow用户

发布于 2020-01-27 12:37:16

它们是异步运行的

每一次循环你:

immediately)

  • Use
  1. Log Foo
  2. 创建一个承诺(该承诺解决了

问题后,将

then解析为排队以运行该函数)

然后在下一次迭代中循环。

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

因为所有的承诺都被解决了,所以它们都运行(和日志栏)。

如果您想在再次循环之前等待的承诺,那么您应该查看the await keyword,它会让asyncTest暂停(然后进入睡眠),直到承诺解除为止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59931271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档