js实现promise.all promise.race promise.resolve

    科技2022-07-14  141

    最近在准备面试,关于 promise 是面试的热点和考点。不定面试官心情好了就会让你写个 promise 的 api

    废话不多说,下面是我写的代码,如有不严谨之处希望指出。

    promise.all 当所有 promise 全部 resolve 或者 一个 reject 时,返回结果。

    function myPromiseAll(promiseArr) { let length = promiseArr.length; let resolvedNum = 0; let resultArr = []; return new Promise((resolve, reject) => { for (let i = 0; i < length; i++) { Promise.resolve(PromiseArr[i]).then( (value) => { resultArr[i] = value; resolvedNum++; if (resolvedNum === length) { return resolve(resultArr); } }, (err) => { return reject(err); } ); } }); }

    promise.resolve 如果原本就是 promise 类型的,那么直接返回。如果是有 then 属性的对象,且then属性是个函数的,就返回一个 promise,这个 promise 中的方法用这个 then 属性。如果是一个值的话,就直接作为 promise,且在 resolve 中传入这个值。

    function myPromiseResolve(value) { if (value instanceof Promise) { return value; } if ( Object.prototype.toString.call(value) === "[object Object]" && typeof value.then === "function" ) { return new Promise(value.then); } return new Promise((resolve) => { resolve(value); }); }

    promise.race 返回第一个结束的 promise 的值

    function myPromiseRace(promiseArr) { let checkFirst = true; return new Promise((resolve, reject) => { for (let i = 0; i < promiseArr.length; i++) { Promise.resolve(promiseArr[i]).then( (value) => { if (checkFirst) { checkFirst = false; resolve(value); } }, (err) => { if (checkFirst) { checkFirst = false; reject(err); } } ); } }); }
    Processed: 0.012, SQL: 8