十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
【相關(guān)學(xué)習(xí)推薦:javascript視頻教程】

很多 JavaScript 的初學(xué)者都曾感受過(guò)被回調(diào)地獄支配的恐懼,直至掌握了 Promise 語(yǔ)法才算解脫。雖然很多語(yǔ)言都早已內(nèi)置了 Promise ,但是 JavaScript 中真正將其發(fā)揚(yáng)光大的還是 jQuery 1.5 對(duì) $.ajax的重構(gòu),支持了 Promise,而且用法也和 jQuery 推崇的鏈?zhǔn)秸{(diào)用不謀而合。后來(lái) ES6 出世,大家才開始進(jìn)入全民 Promise 的時(shí)代,再后來(lái) ES8 又引入了 async 語(yǔ)法,讓 JavaScript 的異步寫法更加優(yōu)雅。
今天我們就一步一步來(lái)實(shí)現(xiàn)一個(gè) Promise,如果你還沒(méi)有用過(guò) Promise,建議先熟悉一下 Promise 語(yǔ)法再來(lái)閱讀本文。
構(gòu)造函數(shù)在已有的
Promise/A+規(guī)范中并沒(méi)有規(guī)定 promise 對(duì)象從何而來(lái),在 jQuery 中通過(guò)調(diào)用 $.Deferred()得到 promise 對(duì)象,ES6 中通過(guò)實(shí)例化 Promise 類得到 promise 對(duì)象。這里我們使用 ES 的語(yǔ)法,構(gòu)造一個(gè)類,通過(guò)實(shí)例化的方式返回 promise 對(duì)象,由于 Promise 已經(jīng)存在,我們暫時(shí)給這個(gè)類取名為 Deferred。
class Deferred { constructor(callback) { const resolve = () => { // TODO
} const reject = () => { // TODO
} try {
callback(resolve, reject)
} catch (error) {
reject(error)
}
}
}復(fù)制代碼構(gòu)造函數(shù)接受一個(gè) callback,調(diào)用 callback 的時(shí)候需傳入 resolve、reject 兩個(gè)方法。
Promise 的狀態(tài)Promise 一共分為三個(gè)狀態(tài):
pending:等待中,這是 Promise 的初始狀態(tài);