[英]Why is the output order different when I use fetch and when I use Promise.resolve?
[英]executing order about promise when different resolve is invoked
我對Promise中的resolve
感到困惑。
resolve
之前援引innerResolve
,但為什么“無極內再執行”前鍍鉻控制台“無極然后執行”記錄。
我認為可能是:
當Promise的狀態為PENDING時,調用resolve
會將狀態設置為FULFILLED, then
調用方法時,作業將排隊到jobQueue中。 innerPromise.then
被調用,因此作業首先進入隊列。
這個問題有規范的解釋嗎?
這是我的代碼:
console.log("main start")
new Promise(resolve =>{
new Promise(innerResolve =>{
resolve()
console.log("resove is called")
innerResolve()
console.log("innerResolve is called")
}).then(() => {
console.log('inner Promise then execute')
})
}).then(() => {
console.log('Promise then execute');
})
console.log("main end")
resolve()
不調用then
方法。 在下一個滴答之后,將對then
方法進行排隊的是resolve()
調用,因此整個內部promise解析器將在內部then
方法之前立即執行,然后在外部then
方法上按該順序調用下一個刻度,因為內部承諾在外部承諾被鏈接之前在外部承諾內部被同步鏈接。
我又添加了兩個日志來幫助闡明為何then
方法的順序與您期望的不同:
console.log("main start") new Promise(resolve =>{ console.log("outer resolver execute") new Promise(innerResolve =>{ resolve() console.log("resove is called") innerResolve() console.log("innerResolve is called") }).then(() => { console.log("inner Promise then execute") }) console.log("inner promise chained") }).then(() => { console.log("Promise then execute"); }) console.log("main end")
由於它們位於單個堆棧框架中,因此會調用bot resolve
resolve()
console.log("resove is called")
innerResolve()
console.log("innerResolve is called")
一旦完成,事件循環將檢查承諾是否已解決,並執行所有已完成的承諾,因為這兩個都已完成。 它可能會調用其中的任何一個,具體取決於編譯器。 試試下面的例子
console.log("main start") new Promise(resolve =>{ new Promise(innerResolve =>{ resolve() console.log("resove is called") setTimeout(innerResolve, 1000); console.log("innerResolve is called") }).then(() => { console.log('inner Promise then execute') }) }).then(() => { console.log('Promise then execute'); }) console.log("main end")
由於innerResolve稍后執行,因此then()稍后被調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.