第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在線等!求大佬解釋下下面這段代碼的執(zhí)行順序萬分感謝

在線等!求大佬解釋下下面這段代碼的執(zhí)行順序萬分感謝

陪伴而非守候 2019-08-14 20:23:52
代碼如下:constp=Promise.resolve();(()=>{constimplicit_promise=newPromise(resolve=>{constpromise=newPromise(res=>res(p));promise.then(()=>{console.log('after:await');resolve();});});returnimplicit_promise;})();p.then(()=>{console.log('tick:a');}).then(()=>{console.log('tick:b');}).then(()=>{console.log('tick:c');})??這段代碼在node11和瀏覽器中的輸出順序?yàn)椋簍ick:atick:bafter:awaittick:c不應(yīng)該先輸出after:await么?
查看完整描述

2 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

constp=Promise.resolve();
(()=>{
constimplicit_promise=newPromise(resolve=>{
//SYNC1
constsync1_promise=newPromise(res=>res(p)/*ASYNC2*/);
sync1_promise.then(()=>{
/*ASYNC3*/
console.log('after:await');
resolve();
});
});
returnimplicit_promise;
})();
p.then(()=>{
//TICKA
console.log('tick:a');
}).then(()=>{
//TICKB
console.log('tick:b');
}).then(()=>{
//TICKC
console.log('tick:c');
})
幾點(diǎn)注意:
Promise的then函數(shù)回調(diào)不會(huì)同步執(zhí)行,如果Promise已經(jīng)被resolve或reject,那么其回調(diào)會(huì)被放進(jìn)異步隊(duì)列。當(dāng)Promise并沒有被resolve或reject的時(shí)候,then的回調(diào)不會(huì)被放入任務(wù)隊(duì)列,而是在Promise在被resolve或reject的時(shí)候才放入異步隊(duì)列。
Promise的then(onFullfilled,onReject)會(huì)返回一個(gè)新的Promise,這個(gè)新的Promise會(huì)在onFullfilled或onReject別執(zhí)行之后,被resolve或reject。
當(dāng)使用Promise來rosolve另一個(gè)Promise的時(shí)候(res=>res(p)),會(huì)建立一個(gè)異步任務(wù),并在異步任務(wù)里調(diào)用p.then(res)。
所以:同步任務(wù),p是一個(gè)已經(jīng)resolve的Promise。匿名函數(shù)直接調(diào)用,SYNC1執(zhí)行,ASYNC2執(zhí)行。ASYNC2執(zhí)行并沒有resolvesync1_promise(見以上第三點(diǎn)),而是增加了一個(gè)異步任務(wù)(異步1),在異步任務(wù)里將執(zhí)行p.then(res)。于是,SYNC1中的sync1_promise并沒有被resolve,ASYNC3也并不會(huì)被放入異步隊(duì)列。接下來,由于p已經(jīng)resolve,TICKA被放入異步隊(duì)列(異步2)。但是,其返回Promise由于TICKA并沒有被調(diào)用(還在異步隊(duì)列里),并沒有被resolve,于是TICKB與TICKC均不會(huì)被放入異步隊(duì)列。
異步1:執(zhí)行p.then(res),p已經(jīng)resolve,所以res被放入異步隊(duì)列(異步3)異步2:執(zhí)行TICKA,輸出"tick:a"。同時(shí),rosolvep.then(TICKA)返回的Promise,TICKB被放入隊(duì)列(異步4)異步3:執(zhí)行res(),resolve掉SYNC1中的sync1_promise,于是在它的then里注冊(cè)的ASYNC3被放入隊(duì)列(異步5)異步4:執(zhí)行TICKB,輸出"tick:b"。同時(shí),rosolvep.then(TICKA).then(TICKB)返回的Promise,TICKC被放入隊(duì)列(異步6)異步5:執(zhí)行ASYNC3,輸出"after:await"。resolveimplicit_promise。異步6:執(zhí)行TICKC,輸出"tick:c"
                            
查看完整回答
反對(duì) 回復(fù) 2019-08-14
?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

js是單線程,而promise是異步的,總是后執(zhí)行,異步里套異步,也是先把同層級(jí)的異步任務(wù)跑完再去跑下一層級(jí)異步任務(wù)。造成這個(gè)的原因可以看下eventLoop;
這是別人的例子,可以看看想想。
setTimeout(function(){
console.log(1);
setTimeout(function(){
console.log(2);
},0);
},0);
setTimeout(function(){
console.log(3);
setTimeout(function(){
console.log(4);
},0);
},0);
結(jié)果打印1324,而不是1234。
鏈接描述JavaScript運(yùn)行機(jī)制詳解:再談EventLoop
                            
查看完整回答
反對(duì) 回復(fù) 2019-08-14
  • 2 回答
  • 0 關(guān)注
  • 343 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)