本文就是從MDN中copy的,僅為了自己復習方便浓瞪。
1、 executor
new Promise( function(resolve, reject) {...} /* executor */ );
executor
是帶有 resolve
和reject
兩個參數(shù)的函數(shù) 。Promise構造函數(shù)執(zhí)行時立即調用executor 函數(shù)褐健, resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構造函數(shù)返回所建promise實例對象前被調用)。
resolve
和和 reject
函數(shù)被調用時澜汤,分別將promise的狀態(tài)改為fulfilled
(完成)或rejected
(失斞裂浮)。executor 內部通常會執(zhí)行一些異步操作俊抵,一旦異步操作執(zhí)行完畢(可能成功/失敗)谁不,要么調用resolve函數(shù)來將promise狀態(tài)改成fulfilled,要么調用reject 函數(shù)將promise的狀態(tài)改為rejected务蝠。如果在executor函數(shù)中拋出一個錯誤拍谐,那么該promise 狀態(tài)為rejected。executor函數(shù)的返回值被忽略馏段。
(resolve和reject函數(shù)是promise內部自己提供的)
function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
};
2轩拨、Promise
Promise 對象是一個代理對象(代理一個值),被代理的值在Promise對象創(chuàng)建時可能是未知的院喜。它允許你為異步操作的成功和失敗分別綁定相應的處理方法(handlers
)亡蓉。 這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執(zhí)行結果喷舀,而是一個能代表未來出現(xiàn)的結果的promise對象砍濒。
一個 Promise有以下幾種狀態(tài):
-
pending
: 初始狀態(tài),既不是成功硫麻,也不是失敗狀態(tài)爸邢。 -
fulfilled
: 意味著操作成功完成。 -
rejected
: 意味著操作失敗拿愧。
pending 狀態(tài)的 Promise 對象可能會變?yōu)閒ulfilled 狀態(tài)并傳遞一個值給相應的狀態(tài)處理方法杠河,也可能變?yōu)槭顟B(tài)(rejected)并傳遞失敗信息。當其中任一種情況出現(xiàn)時,Promise 對象的 then 方法綁定的處理方法(handlers
)就會被調用.
3券敌、 Promise.prototype
-
Promise.prototype.then(onFulfilled, onRejected)
:當Promise狀態(tài)變?yōu)閒ulfilled時唾戚,調用 then 的 onfulfilled 方法,當Promise狀態(tài)為rejected時待诅,調用 then 的 onrejected 方法叹坦, 所以在異步操作的完成和綁定處理方法之間不存在競爭)。 Promise.prototype.catch(onRejected)
Promise.prototype.finally(onFinally)
三者都會返回一個新的Promise卑雁。
4募书、方法
4.1 Promise.resolve(value)
如果參數(shù)value是一個Promise對象,則直接返回這個Promise對象序厉。如果不是轉化為value.
4.2 Promise.reject()
返回一個帶有拒絕原因的Promise對象锐膜。
4.3 Promise.all()
返回一個 Promise
對象用于表示一個異步操作的最終完成 (或失敗), 及其結果值.") 實例,此實例在 iterable
參數(shù)內所有的 promise
都“完成(resolved)”或參數(shù)中不包含 promise
時回調完成(resolve)弛房;如果參數(shù)中 promise
有一個失數勒怠(rejected),此實例回調失斘拇贰(reject)荷逞,失敗原因的是第一個失敗 promise
的結果。
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
實現(xiàn):
/ 添加靜態(tài)all方法
function all (list) {
return new Promise((resolve, reject) => {
//返回每個Promise值的集合
let values = []
let count = 0
for (let [i, p] of list.entries()) {返回一個解析過帶著給定值的Promise對象粹排,如果參數(shù)是一個Promise對象种远,則直接返回這個Promise對象。
// 數(shù)組參數(shù)如果不是Promise實例顽耳,先調用Promise.resolve
Promise.resolve(p).then(res => {
values[i] = res
count++
// 所有狀態(tài)都變成fulfilled時返回的Promise狀態(tài)就變成fulfilled
if (count === list.length) resolve(values)
}, err => { // 有一個被rejected時返回的MyPromise狀態(tài)就變成rejected
reject(err)
})
}
})
}
4.4 Promise.race(iterable)
Promise.race(iterable) 方法返回一個 promise坠敷,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕射富。
function race(list){ //實現(xiàn)race
return new Promise( (resolve, reject) =>{
int count = 0;
for (let [i, p] of list.entries()) { //返回一個解析過帶著給定值的Promise對象膝迎,如果參數(shù)是一個Promise對象,則直接返回這個Promise對象胰耗。
Promise.resolve(p).then((res) =>{
resolve(res);
}, (err) = >{
reject(err);
})
}
}
}