当我执行以下代码时,代码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执行之前被调用。但是我错了,我也不明白为什么。
有人可以解释一下吗?
答案 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。