Promise | all、race 方法(代碼版)

Promise

此次,主要介紹 Promise 的all方法和race方法的原理。javascript

Promise | 手寫原理
Promise | catch、finally 方法java

all 方法

  • 使用
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);
});
  • 思路
  1. 參數:數組
  2. 鏈式調用then方法:能夠數組

    • all 方法返回一個新的Promise
  3. 返回值:數組 or 失敗緣由函數

    • 一個項失敗了,走入失敗態的回調函數 =>失敗緣由
    • 所有成功了,走入成功態的回調函數 => 數組
  • 問題
  1. 數組項,須要判斷是否爲一個Promise?
  2. 如何按照參數數組的順序生成結果數組?
  • 解決
  1. 在【手寫Promise原理】裏面有如何判斷是否爲Promise,能夠參考
  2. 結果數組的順序與參數數組保持一致: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);
            }
        }
    });
};

race 方法

  • 使用
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);
});
  • 思路
  1. 參數:數組
  2. 鏈式調用then方法:能夠ui

    • all 方法返回一個新的Promise
  3. 返回值:比賽誰先回來spa

    • 一個項失敗了,走入失敗態的回調函數 =>失敗緣由
    • 先成功的那一項,走入成功態的回調函數 => 比賽
  • 問題
  1. 數組項,須要判斷是否爲一個Promise?
  • 解決
  1. 在【手寫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);
            }
        }
    }});
};

交流

文章首發↑

相關文章
相關標籤/搜索