在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 阿里二面的一道筆試題,不太明白原理

阿里二面的一道筆試題,不太明白原理

var p1=new Promise(resolve => {
    console.log(1)
    resolve(2)
})
var p2=new Promise(resolve => {
    console.log(3)
    resolve(p1)
})
p1.then(re => {
    console.log(re)    
})
p2.then(re => {
    console.log(re)
})
回答
編輯回答
純妹

js的事件循環(huán)機制可以看這個瀏覽器和Node不同的事件循環(huán)(Event Loop)
剩下的就是resolve(promise)和resolve(1)的問題了。


瀏覽器比node會多輸出一個promise對象,你可以把它理解為整個代碼塊的返回值,它應(yīng)該是最后一個語句的.then的返回值。具體解釋見另一個答案下的評論。

2018年6月19日 02:50
編輯回答
吃藕丑

p1和p2的new操作是在js主線程上執(zhí)行,按照先后順序同步的方式執(zhí)行你傳給promise的函數(shù),而promise實例p1和p2中then方法注冊的回調(diào)任務(wù)是異步執(zhí)行的,所以先輸出1和3。而又因為p2必須等p1 resolve之后才能執(zhí)行then邏輯,所以一定是先輸出p1的2,等p1 resolve之后,p2才會resolve,然后執(zhí)行p2的then邏輯在輸出一個2.

2017年10月22日 14:25
編輯回答
初心

promise一旦創(chuàng)建就會執(zhí)行,所以1,3肯定先打印出來,其他的就不用多說了??梢钥匆幌氯钜环謇蠋煹年P(guān)于ES6的講解,比較詳細,一語難以概括的。希望對你有幫助哇。

2017年3月4日 13:18
編輯回答
吢涼

事件循環(huán)
1>3>清空job>2>2(p1已經(jīng)修改為2)
推薦參考[https://github.com/dwqs/blog/...]

2018年1月26日 14:42
編輯回答
拽很帥

作用域 上下文 運行機制

2017年1月29日 05:58
編輯回答
毀與悔

其實有兩個棧
開始執(zhí)行主棧,p1執(zhí)行,輸出1,resolve的后面的then放在次棧中
p2執(zhí)行,輸出3,,resolve的后面的then放在次棧中
主棧里的執(zhí)行完后,再去順序執(zhí)行次棧里的

這兩個棧其實有專有名詞的,忘了叫啥了

2017年3月7日 18:18
編輯回答
維她命

相信大家對前面132,理解都沒問題

后面一個2,其實是promise A+規(guī)范,我看上面好像都沒有提到

var p2=new Promise(resolve => {
    console.log(3)
    resolve(p1)
})

在規(guī)范里,寫作 [[Resolve]](promise, x) :即使用x resolve promise
規(guī)范規(guī)定:

  1. 如果promise和x指向同一個對象,則將promise的狀態(tài)轉(zhuǎn)換為rejected并且以TypeError作為不可變原因
  2. 如果x是一個promise實例,則以x的狀態(tài)作為promise的狀態(tài) - 先解決x的狀態(tài)

此處是第二種情況

參考文獻:
https://promisesaplus.com/

2018年4月25日 10:44
編輯回答
終相守

第一步,初始化p1
打印 1
第二步,初始化p2
打印 3
第三步,執(zhí)行p1then方法
打印 2
第三步,執(zhí)行p2then方法,在此方法中又調(diào)用p1,而p1 resolve的是2,
所以先打印2,再打印p1對象為Promise

感謝@toBeTheLight
補充說明:
修改上面最后一步:
第四步:執(zhí)行p2then方法,在此方法中又調(diào)用p1,此時,p1已經(jīng)處于resolved狀態(tài),所以返回2.
打印 2.

Promise對象是瀏覽器打印出來,node中執(zhí)行并沒有。詳細解決請參考@toBeTheLight 的回答。
圖片描述

2017年5月7日 15:22