ES6 Promise筆記
阿新 • • 發佈:2018-12-19
promise含義
Promise
是非同步程式設計的一種解決方案,比傳統的解決方案——回撥函式和事件——更合理和更強大。它由社群最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise
物件。
所謂Promise
,簡單說就是一個容器,裡面儲存著某個未來才會結束的事件(通常是一個非同步操作)的結果。從語法上說,Promise 是一個物件,從它可以獲取非同步操作
的訊息。Promise 提供統一的 API,各種非同步操作都可以用同樣的方法進行處理。
有了Promise
物件,就可以將非同步操作以同步操作的流程表達出來,避免了
層層巢狀的回撥函式。此外,Promise物件提供統一的介面,使得控制非同步操作
基本用法
下面程式碼創造了一個Promise例項。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 非同步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
Promise
建構函式接受一個函式作為引數,該函式的兩個引數分別是resolve
和reject
。它們是兩個函式,由 JavaScript 引擎提供,不用自己部署。
- resolve函式
resolve
函式的作用是,將Promise物件的狀態從“未完成”變為“成功”(即從 pending 變為 resolved),在非同步操作成功時呼叫,並將非同步操作的結果
- reject函式
reject
函式的作用是,將Promise物件的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在非同步操作失敗時呼叫,並將非同步操作報出的錯誤
,作為引數傳遞出去。
Promise
例項生成以後,可以用then方法分別指定resolved
狀態和rejected
狀態的回撥函式。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
then
方法可以接受兩個回撥函式作為引數。第一個回撥函式是Promise物件的狀態變為resolve
rejected
時呼叫。其中,第二個函式是可選
的,不一定要提供。這兩個函式都接受Promise物件傳出的值作為引數。
promiss例項
一個Promise物件的簡單例子。
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve('done'), ms, );
});
}
timeout(100).then((value) => {
console.log(value);
});