为什么首先出现解决消息?

Edw*_*win 11 javascript es6-promise

我试图围绕JavaScript中的诺言进行整理。我当时的幻想是,一旦解决了诺言,就永远不会回到被拒绝的状态。为了测试我写了一个小脚本。我看到返回的第一条消息是解析消息“ 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)
    })
}
Run Code Online (Sandbox Code Playgroud)

在控制台上:

[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"}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

看完之后

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

我到了这段代码。catch子被删除。

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)
}) 
}
Run Code Online (Sandbox Code Playgroud)

在控制台上:

[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"}
Run Code Online (Sandbox Code Playgroud)

lud*_*ico 4

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

在此输入图像描述

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

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

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

p.then((message) => {
        console.log(message)
    })
p.catch((message) => {
        console.log(message)
    })
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述