外部promise有多個(gè)then鏈?zhǔn)秸{(diào)用,第一個(gè)then里面執(zhí)行另一個(gè)promise团赏,也帶多個(gè)then鏈?zhǔn)秸{(diào)用垛耳,他們的執(zhí)行順序會(huì)是怎樣?
new Promise((resolve, reject) => {
console.log("log: 外部promise")
resolve()
})
.then(() => {
console.log("log: 外部第一個(gè)then")
new Promise((resolve, reject) => {
console.log("log: 內(nèi)部promise")
resolve()
})
.then(() => {
console.log("log: 內(nèi)部第一個(gè)then")
})
.then(() => {
console.log("log: 內(nèi)部第二個(gè)then")
})
})
.then(() => {
console.log("log: 外部第二個(gè)then")
})
答案
log: 外部promise
log: 外部第一個(gè)then
log: 內(nèi)部promise
log: 內(nèi)部第一個(gè)then
log: 外部第二個(gè)then
log: 內(nèi)部第二個(gè)then
嘗試解釋
1啸箫,new promsie是同步代碼耸彪,立即執(zhí)行
2,外部promise第一個(gè)then需要等外部promise被resolve后才執(zhí)行忘苛,外部promise立即被resolve,于是執(zhí)行注冊(cè)的then回調(diào)蝉娜。此時(shí)外部第二then并未執(zhí)行,因?yàn)樗却氖峭獠康谝粋€(gè)then返回的promise
3扎唾,進(jìn)入外部第一個(gè)then召川,回調(diào)里面是一個(gè)promise,執(zhí)行內(nèi)部promise時(shí)胸遇,同樣兩個(gè)then鏈?zhǔn)秸{(diào)用荧呐,內(nèi)部第一個(gè)then執(zhí)行后,內(nèi)部promise算執(zhí)行完,返回一個(gè)新的promise給內(nèi)部第二then用
4倍阐,外部第一個(gè)then執(zhí)行完且有返回值概疆,進(jìn)入外部第二then
5,之后執(zhí)行內(nèi)部第二then
看一個(gè)例子
var p = new Promise((resolve, reject) => {
resolve("good")
})
p.then(x => console.log("x:1", x))
p.then(x => console.log("x:2", x))
p這個(gè)promise注冊(cè)了兩個(gè)then峰搪,注意跟鏈?zhǔn)秸{(diào)用then
的區(qū)別岔冀,這個(gè)就像發(fā)布訂閱模式,有兩個(gè)監(jiān)聽者概耻,resolve時(shí)使套,這兩個(gè)then同時(shí)執(zhí)行,看完這個(gè)應(yīng)該對(duì)上面理解有幫助