当我调用这个promise时,输出与函数调用的序列不匹配,。then出现在。catch之前,尽管promise在。then之后被调用,这其中有什么原因吗?
null
const verifier = (a, b) =>
new Promise((resolve, reject) => (a > b ? resolve(true) : reject(false)));
verifier(3, 4)
.then((response) => console.log("response: ", response))
.catch((error) => console.log("error: ", error));
verifier(5, 4)
.then((response) => console.log("response: ", response))
.catch((error) => console.log("error: ", error));
null
输出量
node promises.js
response: true
error: false
这是一个很酷的问题。
执行此操作时:
verifier(3,4).then(...)
它返回一个新的承诺,在新拒绝的承诺运行后面的.catch()
之前,它需要另一个返回事件循环的循环。 从而得出以下结论:
verifier(5,4).then(...)
首先运行的机会,因为在第一个处理程序的.catch()
处理程序进入队列之前,它已经在队列中。
注意,如果您使用.then(f1,f2)
表单代替.then().catch()
,它确实会在您期望的时候运行,因为没有额外的承诺,因此没有额外的标记:
null
const verifier = (a, b) =>
new Promise((resolve, reject) => (a > b ? resolve(true) : reject(false)));
verifier(3, 4)
.then((response) => console.log("response (3,4): ", response),
(error) => console.log("error (3,4): ", error)
);
verifier(5, 4)
.then((response) => console.log("response (5,4): ", response))
.catch((error) => console.log("error (5,4): ", error));
Promise.resolve()
.then(() => console.log('a1'))
.then(() => console.log('a2'))
.then(() => console.log('a3'))
Promise.resolve()
.then(() => console.log('b1'))
.then(() => console.log('b2'))
.then(() => console.log('b3'))
而不是输出a1,a2,a3,b1,b2,b3,您将看到a1,b1,a2,b2,a3,b3,这是因为同样的原因--每返回一个承诺,然后它将到达事件循环队列的末尾。 所以我们可以看到这场“承诺赛跑”。 当有一些嵌套的承诺时也是一样。