ES6-promise

Promise對象代表一個異步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。

Promise對象有以下兩個特點。

(1)對象的狀態不受外界影響。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:從pending變爲fulfilled和從pending變爲rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱爲 resolved(已定型)。

ES6 規定,Promise對象是一個構造函數,用來生成Promise實例。
Promise構造函數接受一個函數作爲參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署。
栗子:
const promise = new Promise(function(resolve, reject) {
//異步請求
http.post(url, params);

if (/* 異步操作成功 */){
resolve(value);
} else {
reject(error);
}
});

當然也可以這樣寫:
const promise = new Promise(function(resolve, reject) {
//異步請求
http.post(url, params);
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});

或者
const promise = new Promise(function(resolve, reject) {
//異步請求
http.post(url, params);
});
promise.then(function(value) {
// success
}).catch( function(error) {
// failure
});

promise的原型對象方法:
Promise.prototype.then():作用是爲 Promise 實例添加狀態改變時的回調函數。
Promise.prototype.catch():用於指定發生錯誤時的回調函數。
Promise.prototype.finally() :finally方法用於指定不管 Promise 對象最後狀態如何,都會執行的操作。
Promise.all():用於將多個 Promise 實例,包裝成一個新的 Promise 實例。
舉個栗子:
const p = Promise.all([p1, p2, p3]);
上面代碼中,Promise.all方法接受一個數組作爲參數,p1、p2、p3都是 Promise 實例,如果不是,就會先調用下面講到的Promise.resolve方法,將參數轉爲 Promise 實例,再進一步處理。(Promise.all方法的參數可以不是數組,但必須具有 Iterator 接口,且返回的每個成員都是 Promise 實例。)
p的狀態由p1、p2、p3決定,分成兩種情況。
(1)只有p1、p2、p3的狀態都變成fulfilled,p的狀態纔會變成fulfilled,此時p1、p2、p3的返回值組成一個數組,傳遞給p的回調函數。
(2)只要p1、p2、p3之中有一個被rejected,p的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章