Promise
狀態(tài)
pending
: 初始狀態(tài), 非 fulfilled 或 rejected.
fulfilled
: 成功的操作.
rejected
: 失敗的操作.
基本用法
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 異步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
then()
它的作用是為 Promise 實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。前面說(shuō)過(guò)巫糙,then方法的第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào)函數(shù)朗儒,第二個(gè)參數(shù)(可選)是rejected狀態(tài)的回調(diào)函數(shù)。
getJSON("/post/1.json").then(function(post) {
return getJSON(post.commentURL);
}).then(function funcA(comments) {
console.log("resolved: ", comments);
}, function funcB(err){
console.log("rejected: ", err);
});
then方法返回的是一個(gè)新的Promise實(shí)例(注意参淹,不是原來(lái)那個(gè)Promise實(shí)例)醉锄。因此可以采用鏈?zhǔn)綄懛ǎ磘hen方法后面再調(diào)用另一個(gè)then方法浙值。
catch()
Promise.prototype.catch方法是.then(null, rejection)的別名恳不,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
getJSON('/posts.json').then(function(posts) {
// ...
}).catch(function(error) {
// 處理 getJSON 和 前一個(gè)回調(diào)函數(shù)運(yùn)行時(shí)發(fā)生的錯(cuò)誤
console.log('發(fā)生錯(cuò)誤开呐!', error);
});
finally()
finally方法用于指定不管 Promise 對(duì)象最后狀態(tài)如何烟勋,都會(huì)執(zhí)行的操作。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
all()
Promise.all方法用于將多個(gè) Promise 實(shí)例筐付,包裝成一個(gè)新的 Promise 實(shí)例卵惦。
const p = Promise.all([p1, p2, p3]);
上面代碼中,Promise.all方法接受一個(gè)數(shù)組作為參數(shù)瓦戚,p1沮尿、p2、p3都是 Promise 實(shí)例较解,如果不是畜疾,就會(huì)先調(diào)用下面講到的Promise.resolve方法赴邻,將參數(shù)轉(zhuǎn)為 Promise 實(shí)例,再進(jìn)一步處理庸疾。(Promise.all方法的參數(shù)可以不是數(shù)組乍楚,但必須具有 Iterator 接口当编,且返回的每個(gè)成員都是 Promise 實(shí)例届慈。)
p的狀態(tài)由p1、p2忿偷、p3決定金顿,分成兩種情況。
- (1)只有p1鲤桥、p2揍拆、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled茶凳,此時(shí)p1嫂拴、p2、p3的返回值組成一個(gè)數(shù)組贮喧,傳遞給p的回調(diào)函數(shù)筒狠。
- (2)只要p1、p2箱沦、p3之中有一個(gè)被rejected辩恼,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值谓形,會(huì)傳遞給p的回調(diào)函數(shù)灶伊。
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
race()
const p = Promise.race([p1, p2, p3]);
上面代碼中,只要p1寒跳、p2聘萨、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變童太。那個(gè)率先改變的 Promise 實(shí)例的返回值米辐,就傳遞給p的回調(diào)函數(shù)。
resolve()
有時(shí)需要將現(xiàn)有對(duì)象轉(zhuǎn)為 Promise 對(duì)象康愤,Promise.resolve方法就起到這個(gè)作用儡循。
Promise.resolve('foo')
// 等價(jià)于
new Promise(resolve => resolve('foo'))
reject()
Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例,該實(shí)例的狀態(tài)為rejected征冷。
const p = Promise.reject('出錯(cuò)了');
// 等同于
const p = new Promise((resolve, reject) => reject('出錯(cuò)了'))
p.then(null, function (s) {
console.log(s)
});