提问者:小点点

Javascript保证好奇心


当我调用这个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

共2个答案

匿名用户

这是一个很酷的问题。

执行此操作时:

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,这是因为同样的原因--每返回一个承诺,然后它将到达事件循环队列的末尾。 所以我们可以看到这场“承诺赛跑”。 当有一些嵌套的承诺时也是一样。