此次,主要介紹 Promise 的all方法和race方法的原理。javascript
【Promise | 手寫原理】
【Promise | catch、finally 方法】java
let fs = require('fs'); let p = new Promise((resolve, reject) => { fs.readFile('./name.txt', 'utf8', function (err, data) { if (err) { reject(err); } resolve(data); }); }); Promise.all([1,2,p ]).then(data => { console.log('data', data); }, err => { console.log('err', err); });
- 參數:數組
鏈式調用then方法:能夠數組
- all 方法返回一個新的Promise
返回值:數組 or 失敗緣由函數
- 一個項失敗了,走入失敗態的回調函數 =>失敗緣由
- 所有成功了,走入成功態的回調函數 => 數組
- 數組項,須要判斷是否爲一個Promise?
- 如何按照參數數組的順序生成結果數組?
- 在【手寫Promise原理】裏面有如何判斷是否爲Promise,能夠參考
- 結果數組的順序與參數數組保持一致:i 計數與參數數組的length相等,即停。
function isPromise(x) { if (typeof x === 'function' || (typeof x === 'object' && x != null)) { if (typeof x.then === 'function') { return true; } } return false; } Promise.all = function (values){ return new Promise((resolve, reject) => { let arr = []; let i = 0; let processData = (key, data) => { arr[i] = data; if (++i === values.length) { resolve(arr); } }; for (let i = 0; i < values.length; i++) { let current = values[i]; if (isPromise(current)) { current.then(y => { processData(i, y); }, reject); } else { processData(i, current); } } }); };
let fs = require('fs'); let p = new Promise((resolve, reject) => { fs.readFile('./name.txt', 'utf8', function (err, data) { if (err) { reject(err); } resolve(data); }); }); Promise.all([2,p ]).then(data => { console.log('data', data); }, err => { console.log('err', err); });
- 參數:數組
鏈式調用then方法:能夠ui
- all 方法返回一個新的Promise
返回值:比賽誰先回來spa
- 一個項失敗了,走入失敗態的回調函數 =>失敗緣由
- 先成功的那一項,走入成功態的回調函數 => 比賽
- 數組項,須要判斷是否爲一個Promise?
- 在【手寫Promise原理】裏面有如何判斷是否爲Promise,能夠參考。
function isPromise(x) { if (typeof x === 'function' || (typeof x === 'object' && x != null)) { if (typeof x.then === 'function') { return true; } } return false; } Promise.race = function (values){ return new Promise((resolve, reject) => { for (let i = 0; i < values.length; i++) { let current = values[i]; if (isPromise(current)) { current.then(resolve, reject); } else { resolve(current); } } }}); };