promise對象
含義
promise是一個對象,可以獲取異步操作的消息丽声,是異步編程的一種方案。-
特點
- 對象狀態(tài)不受外界影響雁社。Promise對象代表一個異步操作浴井,有三種狀態(tài):Pending(進(jìn)行中)霉撵、Resolved(已完成洪囤,又稱Fulfilled)和Rejected(已失敗)撕氧。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài)伦泥,任何其他操作都無法改變這個狀態(tài)。
- 一旦狀態(tài)改變奄喂,就不會再變。Promise對象的狀態(tài)改變跨新,只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。有了Promise對象坏逢,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)是整。
-
基本用法
ES6規(guī)定,Promise對象是一個構(gòu)造函數(shù)浮入,用來生成Promise實例龙优。var promise = new Promise(function(resolve, reject) { // ... some code if (/* 異步操作成功 */){ resolve(value); } else { reject(error); } });
then方法
- then方法可以接受兩個回調(diào)函數(shù)作為參數(shù)事秀。
- 第一個回調(diào)函數(shù)是Promise對象的狀態(tài)變?yōu)镽esolved時調(diào)用
- 第二個回調(diào)函數(shù)是Promise對象的狀態(tài)變?yōu)镽eject時調(diào)用(可選)。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
- Promise新建后就會立即執(zhí)行易迹。
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('Resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// Resolved
- 上面代碼中,Promise新建后立即執(zhí)行睹欲,所以首先輸出的是“Promise”供炼。然后窘疮,then方法指定的回調(diào)函數(shù),將在當(dāng)前腳本所有同步任務(wù)執(zhí)行完才會執(zhí)行考余,所以“Resolved”最后輸出。
Promise.all()
var p = Promise.all([p1, p2, p3]);
上面代碼中楚堤,Promise.all方法接受一個數(shù)組作為參數(shù)疫蔓,p1、p2衅胀、p3都是Promise對象的實例岔乔,如果不是滚躯,就會先調(diào)用下面講到的Promise.resolve方法,將參數(shù)轉(zhuǎn)為Promise實例掸掏,再進(jìn)一步處理。(Promise.all方法的參數(shù)可以不是數(shù)組丧凤,但必須具有Iterator接口募闲,且返回的每個成員都是Promise實例愿待。)
-
p的狀態(tài)由p1、p2仍侥、p3決定:
- 只有p1要出、p2农渊、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會變成fulfilled砸紊,此時p1况脆、p2批糟、p3的返回值組成一個數(shù)組,傳遞給p的回調(diào)函數(shù)徽鼎。
- 只要p1、p2否淤、p3之中有一個被rejected悄但,p的狀態(tài)就變成rejected石抡,此時第一個被reject的實例的返回值,會傳遞給p的回調(diào)函數(shù)啰扛。
Promise.race()
var p = Promise.race([p1, p2, p3]);
- 上面代碼中嚎京,只要p1、p2鞍帝、p3之中有一個實例率先改變狀態(tài)诫睬,p的狀態(tài)就跟著改變帕涌。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調(diào)函數(shù)蚓曼。
- Promise.race方法的參數(shù)與Promise.all方法一樣,如果不是 Promise 實例纫版,就會先調(diào)用下面講到的Promise.resolve方法谷扣,將參數(shù)轉(zhuǎn)為 Promise 實例捎琐,再進(jìn)一步處理裹匙。