例子:
let a = Promise.resolve("123")
.then(val => {
console.log(a);
return 100;
})
.then(val => {
console.log(val);
console.log(a);
})
.finally(() => {
console.log(a);
});
輸出:
Promise { <pending> }
100
Promise { <pending> }
Promise { <pending> }
為什么已解決的承諾仍處于掛起狀態?
uj5u.com熱心網友回復:
因此,a包含執行所有這些的結果:
let a = Promise.resolve(...).then(...).then(...).finally(...);
該階段的每一步都會創建一個新的承諾并a包含鏈中的最后一個承諾(最后一個承諾是.finally()回傳的承諾)。每次登錄時a,您都在記錄最終承諾,并且在鏈完成之前尚未解決。
請記住,所有這些.then()和.finally()方法都會立即執行,并且每個都會回傳一個新的承諾。當它們執行時,它們注冊傳遞給它們的回呼,以便稍后在與它們關聯的承諾決議或拒絕時呼叫這些回呼。即使第一個 promise 被立即決議,它仍然不會執行它的.then()處理程式,直到整個.then().then().finally()執行鏈和該鏈中的所有 promise 都被創建并且該鏈中指定的所有處理程式都被注冊之后。所以,a包含.finally()回傳的第四個承諾,而不是那個承諾Promise.resolve()創建并且第四個承諾直到鏈中的所有處理程式都完成執行后才會解決。由于您正在從所有這些處理程式進行日志記錄,這就是為什么鏈中的最后一個承諾仍然顯示為pending您正在記錄它的任何地方。
如果你以不同的方式做這樣的事情:
let d = Promise.resolve("123");
d.then(val => {
console.log(d);
return 100;
}).then(val => {
console.log(val);
console.log(d);
}).finally(() => {
console.log(d);
});
然后,你會看到這個:
Promise { '123' }
100
Promise { '123' }
Promise { '123' }
因為 nowd代表鏈中的第一個承諾,而不是鏈中的最終承諾,所以當所有其他處理程式執行時它確實被解決了。
因此,您可能沒有意識到這里的操作部分是 each .then(), .catch()or.finally()回傳一個掛接到它前面的鏈的新承諾。您的原始console.log(a)承諾僅監控鏈中的最后一個承諾,而不是鏈中的第一個承諾或鏈中的當前承諾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/383075.html
標籤:javascript 节点.js 承诺
