首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么首先出现resolve消息?

为什么首先出现resolve消息?
EN

Stack Overflow用户
提问于 2019-04-18 02:39:05
回答 3查看 418关注 0票数 11

我正试着把注意力集中在JavaScript中的承诺上。我有一种错觉,认为一旦一个承诺被解决了,它就再也不会被拒绝了。为了测试我写了一个小脚本。我看到返回的第一个消息是resolve消息"1 resolve 2“等等。我希望第一个消息是"0 reject 1”。

for (let i = 0; i < 10; i++) {
    let p = new Promise((resolve, reject) => {

        let a = 1 + (i % 2)

        if (a === 2) {
            resolve(i + ' resolve ' + a)
        } else {
            reject(i + ' reject ' + a)
        }       
    })

    p.then((message) => {
        console.log(message)
    }).catch((message) => {
        console.log(message)
    })
}

在控制台:

[Log] 1 resolve 2
[Log] 3 resolve 2
[Log] 5 resolve 2
[Log] 7 resolve 2
[Log] 9 resolve 2
[Log] 0 reject 1
[Log] 2 reject 1
[Log] 4 reject 1
[Log] 6 reject 1
[Log] 8 reject 1
< Promise {status: "pending"}

谢谢你的帮助...

读完后

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

我找到了这段代码。捕获物将被移除。

for (let i = 0; i < 10; i++) {
let p = new Promise((resolve, reject) => {

        let a = 1 + (i % 2)

    if (a === 2) {
        resolve(i + ' resolve ' + a)
    } else {
        reject(i + ' reject ' + a)
    }

})

p.then((message) => {
    console.log(message)
}, failed => {
    console.log(failed)
}) 
}

在控制台:

[Log] 0 reject 1
[Log] 1 resolve 2
[Log] 2 reject 1
[Log] 3 resolve 2
[Log] 4 reject 1
[Log] 5 resolve 2
[Log] 6 reject 1
[Log] 7 resolve 2
[Log] 8 reject 1
[Log] 9 resolve 2
< Promise {status: "pending"}
EN

回答 3

Stack Overflow用户

发布于 2019-04-18 03:33:55

您可以通过使用浏览器开发工具的控制台以及设置断点(如果您使用的是ChromeFirefox,本文可能会有所帮助)来了解幕后发生的事情:

正如您所看到的,您的所有10个承诺都是在执行其中任何一个之前创建的(解析/拒绝)。

有趣的是,在您的代码中,首先处理已解析的承诺。

如果在两个单独的定义中定义处理程序,您将获得预期的结果:

p.then((message) => {
        console.log(message)
    })
p.catch((message) => {
        console.log(message)
    })

输出:

票数 4
EN

Stack Overflow用户

发布于 2019-04-18 03:33:58

重点是,promise是作为异步调用使用的,所以当您执行循环并为每次迭代创建一个新promise时,您正在创建新的实例,并且每个实例都可以在各自的时间内执行。

但这到底意味着什么呢?解释是,当你在一个循环中创建10个新的承诺时,每个承诺都会在他自己的时间内执行,并且很可能会打乱你的承诺解析顺序。

你能做些什么来解决这个问题?您可以使用await命令等待每个承诺的求解,如下面的代码所示:

for (let i = 0; i < 10; i++) {
    let p = new Promise((resolve, reject) => {

        let a = 1 + (i % 2)

        if (a === 2) {
            resolve(i + ' resolve ' + a)
        } else {
            reject(i + ' reject ' + a)
        }       
    })

    await p.then((message) => {
        console.log(message)
    }).catch((message) => {
        console.log(message)
    })
}

或者您可以尝试使用Promise.all(),它基本上可以为您解决订单问题,请参阅官方docs here

票数 2
EN

Stack Overflow用户

发布于 2019-04-18 04:03:13

我在这里找到了一个解决方案:MDN promise then

for (let i = 0; i < 10; i++) {
    let p = new Promise((resolve, reject) => {
        let a = 1 + (i % 2)

        if (a === 2) {
            resolve(i + ' resolve ' + a)
        } else {
            reject(i + ' reject ' + a)
        }
    })

    p.then((message) => {
        console.log(message)
    }, failed => {
        console.log(failed)
    }) 
}

promise.catch()正在调用promise.then(未定义,onreject)。这就是为什么resolve总是首先出现的原因。

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

https://stackoverflow.com/questions/55734046

复制
相关文章

相似问题

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