为什么最终在Promise之前被执行?

时间:2018-11-26 13:50:53

标签: javascript promise try-catch

当我执行以下代码时,代码A的代码块先于代码B的代码块执行。

return new Promise((resolve, reject) => {
  try {
    resolve()
  } finally {
    // block of code A
  }
}).then(() => {
  // block of code B
})

但是我不明白为什么要先执行A。

promise的解析(或拒绝)会触发与之对应的then,因此我希望代码B的块在代码A的块之前运行。

来自doc

  

当这些选项(解决/拒绝)中的任何一个发生时,都将调用由promise的then方法排队的关联处理程序。

我也读过这篇文章:

  

在Promise构造函数甚至返回创建的对象之前调用执行程序

执行程序=作为参数传递给Promise对象的函数。

后一个引用使我认为try catch可以在触发解决方案或拒绝处理程序之前(在从Promise返回执行程序函数之前)完成。它将说明finally在Promise的then之前被触发。

但是,我尝试使用fetch调用外部API,并在继续之前await进行响应,希望Promise函数将有时间在{{1}之前返回执行程序函数。 }完成:

try catch

事实证明A仍在B之前执行。我希望解析处理程序在A执行之前被触发,因为return new Promise(async (resolve, reject) => { try { await fetch('https://swapi.co/api/people/1/') resolve() } finally { // block of code A } }).then(() => { // block of code B }) 在A执行之前被调用。但是我错了,我也不明白为什么。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:0)

finally {}块是try catch块的一部分。因此,如果您有一组以上的try catch块,那么每个set可以有自己的finally块,它们将在try块完成或相应的catch块完成时执行。

答案 1 :(得分:0)

promise构造函数始终同步执行。这意味着其中的所有代码都将立即执行。

一个then排队一个函数,在兑现承诺后将要执行。您传递给then的函数在所有同步代码之后运行。

console.log(1);
Promise.resolve().then(() => console.log(3));
console.log(2); // logs 1, 2, 3

规范将其称为EnqueueJob。请注意,创建诺言返回函数时,应避免使用explicit construction。异步函数已经自动返回了Promise。