Promise
異步操作的同步表現(xiàn)形式
優(yōu)點(diǎn)
1.解決回調(diào)地獄(Callback Hell)問(wèn)題
2.由于棧信息不同 無(wú)法try catch return throw。解決無(wú)法捕獲異常或異常捕獲不可控
簡(jiǎn)介
Promise的構(gòu)造函數(shù)接收一個(gè)參數(shù),是函數(shù),并且傳入兩個(gè)參數(shù):resolve,reject,分別表示異步操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)。其實(shí)這里用“成功”和“失敗”來(lái)描述并不準(zhǔn)確,按照標(biāo)準(zhǔn)來(lái)講,resolve是將Promise的狀態(tài)置為fullfiled,reject是將Promise的狀態(tài)置為rejected。
Promise的優(yōu)勢(shì)在于,可以在then方法中繼續(xù)寫(xiě)Promise對(duì)象并返回,然后繼續(xù)調(diào)用then來(lái)進(jìn)行回調(diào)操作。
Promise的精髓是“狀態(tài)”,用維護(hù)狀態(tài)、傳遞狀態(tài)的方式來(lái)使得回調(diào)函數(shù)能夠及時(shí)調(diào)用,它比傳遞callback函數(shù)要簡(jiǎn)單、靈活的多

然后回到開(kāi)頭的代碼。因?yàn)閟ettimeout是宏任務(wù),雖然先執(zhí)行的他,但是他被放到了宏任務(wù)的eventqueue里面,然后代碼繼續(xù)往下檢查看有沒(méi)有微任務(wù),檢測(cè)到Promise的then函數(shù)把他放入了微任務(wù)序列。等到主線進(jìn)程的所有代碼執(zhí)行結(jié)束后。先從微任務(wù)queue里拿回掉函數(shù),然后微任務(wù)queue空了后再?gòu)暮耆蝿?wù)的queue拿函數(shù)。
宏任務(wù)一般是:包括整體代碼script,setTimeout,setInterval。
微任務(wù):Promise,process.nextTick。
Promise是什么
?按照用途解釋:
1.主要用于異步計(jì)算
?2.可以將一步操作隊(duì)列化,按照期望的順序執(zhí)行,返回符合預(yù)期的結(jié)果
3.可以在對(duì)象之間傳遞和操作Promise,幫助我們處理隊(duì)列
Promise產(chǎn)生的原因:
1.js為檢查表單而生
2.創(chuàng)造它的首要目標(biāo)是為了操作DOM
3.所以js很多操作都是異步的
異步回調(diào)的缺點(diǎn):
1.原函數(shù)與異步回調(diào)函數(shù)在不同棧內(nèi)運(yùn)行,異步回調(diào)函數(shù)無(wú)法獲取原函數(shù)棧的信息,原函數(shù)也無(wú)法捕獲異步回調(diào)函數(shù)拋出的錯(cuò)誤。異步回調(diào)無(wú)法正常使用try catch(無(wú)法正常檢索堆棧信息)
2.由于異步,我們可能無(wú)法判斷何時(shí)完成的,所以在高級(jí)作用域/外層作用域聲明很多變量以便于內(nèi)層修改,這些變量有可能被其他的函數(shù)訪問(wèn)和修改,最終出現(xiàn)錯(cuò)誤
3.嵌套層次很深
4.無(wú)法正常使用return和throw
5.多個(gè)回調(diào)之間無(wú)法建立聯(lián)系
function?MyPromise?(fn)?{
console.info('1');
let?self?=?this;
//?用來(lái)保存?then?傳入的回調(diào)函數(shù)
this.callback?=?u?=?undefined;
console.info('2');
function?resolve?(val)?{
console.info('3');
setTimeout(function(){
console.info('執(zhí)行callback');
self.callback?&&?self.callback(val);
})
console.info('4');
return?self;
}
console.info('5');
fn(resolve);
console.info('6');
}
MyPromise.prototype.then?=?f?=?function?(next)?{
console.info('7');
this.callback?=?next;
console.info('8');
};
let?a?=?new?MyPromise((resolve)?=>?{
console.info('9');
resolve('gehehehe')
console.info('10')
}).then((value)?=>?{
console.info('---',value)?})
