前面咱們分析了Promise的then
和catch
方法,接下來咱們一塊兒來看看reject
、resolve
、race
和all
方法的實現。git
Note:github
Promise原理分析一segmentfault
Promise.reject(reason)
方法返回一個被拒絕的Promise對象。數組
語法promise
Promise.reject(new Error('something wrong')).then(null, err => { // todo }); Promise.reject(new Error('something wrong')).catch(err => { // todo });
參數ide
name | desc |
---|---|
reason | 被拒絕的緣由。 |
建立一個新的Promise對象,經過其構造函數的參數reject
函數對象將狀態變爲rejected
。函數
static reject(reason) { return new Promise((resovle, reject) => { reject(reason); }); }
Promise.resolve(value)
方法返回一個以給定值解析後的Promise對象。但若是這個值是個Promise對象,返回的Promise會採用它的最終狀態;不然以該值爲成功狀態返回promise對象。prototype
語法code
Promise.resolve(1000).then(value => { // todo });
參數對象
name | desc |
---|---|
value | 用來解析待返回Promise對象的參數。(能夠是一個Promise對象) |
若是是一個Promise對象,直接返回該值;不然建立一個新的Promise對象,經過其構造函數的參數resolve
函數對象將狀態變爲fulfilled
。
static resolve(value) { // 若是爲Promise對象,直接返回當前值 if (value instanceof Promise) { return value; } return new Promise(resovle => { resovle(value); }); }
Promise.race(values)
返回一個Promise對象,這個Promise在values
中的任意一個Promise被解決或拒絕後,馬上以相同的解決值被解決或以相同的拒絕緣由被拒絕。
語法
Promise.race([p1, p2]).then(value => { // todo }, reason => { // todo });
參數
name | desc |
---|---|
values | 一個Array對象。 |
使用Promise.resolve
對迭代對象值進行解析,且將新Promise的參數resolve
和reject
函數對象傳遞給then
方法,以觸發新Promise對象的狀態轉換。
static race(values) { // 校驗values參數是否爲數組 if (!isArray(values)) { return Promise.reject(new Error('Promise.race must be provided an Array')); } return new Promise((resovle, reject) => { values.forEach(value => { // 遍歷迭代對象 // 使用Promise.resolve解析value值(可能爲Promise對象或其餘值) // 將新Promise對象的resolve, reject傳遞給解析後的Promise.prototype.then Promise.resolve(value).then(resovle, reject); }); }); }
Promise.all(values)
方法返回一個Promise對象,該Promise會等values
參數內的全部值都被resolve後才被resolve,或以values
參數內的第一個被reject的緣由而被reject。
語法
Promise.all([p1, p2]).then(values => { // todo });
參數
name | desc |
---|---|
values | 一個Array對象。 |
經過Promise.resolve
對迭代對象值進行解析,使用數組記錄values
參數的全部值被解析後的結果,當全部值解析後resolve,並傳遞其全部解析結果。同時傳遞reject函數對象給Promise.resolve().then參數,以觸發新Promise對象的狀態轉換。
static all(values) { // 校驗values參數是否爲數組 if (!isArray(values)) { return Promise.reject(new Error('Promise.all must be provided an Array')); } return new Promise((resolve, reject) => { // 若是數組長度爲0,直接resolve且結束處理 if (values.length === 0) { resolve([]); return; } const len = values.length; // 建立一個數組用來保存values的Promise返回值 const result = new Array(len); let remaining = len; // 處理values數組中的值 function doResolve(index, value) { Promise.resolve(value).then(val => { // 將解析後的Promise返回值保存在對應索引的結果集中 result[index] = val; // 當values的全部值都解析完後,調用新Promise對象的resolve函數方法, // 把全部返回值result傳遞給後續處理中,且將狀態轉換爲fulfilled。 if (--remaining === 0) { resolve(result); } }, reject); } // 迭代values對象,傳遞其索引位置以確保結果值的順序 for (let i = 0; i < len; i++) { doResolve(i, values[i]); } }); }
Promise.reject
和Promise.resolve
經過Promise的構造函數實現狀態轉變。
Promise.race
和Promise.all
使用Promise.resolve
解析values值,同時經過構造函數的executor參數的函數對象觸發Promise的狀態轉變,其中Promise.all
使用數組記錄返回值、使用索引值以確保其返回值在結果集中的順序。
MDN