Promise

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)單、靈活的多


2,4,3,1

然后回到開(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)?})


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,823評(píng)論 1 56
  • title: promise總結(jié) 總結(jié)在前 前言 下文類似 Promise#then、Promise#resolv...
    JyLie閱讀 12,411評(píng)論 1 21
  • 一、Promise的含義 Promise在JavaScript語(yǔ)言中早有實(shí)現(xiàn),ES6將其寫(xiě)進(jìn)了語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評(píng)論 0 2
  • Prepending(進(jìn)行時(shí)),Resolve(成功了),Reject(失敗了),then......等 1.Pr...
    _菩提本無(wú)樹(shù)_閱讀 49,376評(píng)論 0 21
  • Promise含義 Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更強(qiáng)大。所謂Pr...
    oWSQo閱讀 1,130評(píng)論 0 4

友情鏈接更多精彩內(nèi)容