[面试]手写题-Promise.all() Promise.race()

Promise.all()

接收一个Promise数组,数组中如有非Promise项,则此项当做成功
如果所有Promise都成功,则返回成功结果数组
如果有一个Promise失败,则返回这个失败结果

static all(promises) {
  const result = [];//创建一个空数组用于存储每个Promise的结果
  let count = 0;
  // 返回一个新的MyPromise实例
  return new MyPromise((resolve, reject) => {
  
    //将解析值存入结果数组并检查是否完成
    const addData = (index, value) => {
        result[index] = value;// 将值存入结果数组的对应位置
        count++;
        // 当所有Promise都完成时,
        if (count === promises.length) resolve(result)
    }
    
    // 遍历传入的Promise数组
    promises.forEach((promise, index) => {
    	// 检查当前项是否是MyPromise实例
        if (promise instanceof MyPromise) {
        	//  如果是Promise,等待其状态变更
            promise.then(res => {
                addData(index, res)
            }, err => {
                reject(err))
            })
        } else { // 非Promise值直接存入结果数组
            addData(index, promise)
        }
    })
  })
}

Promise.race()

接收一个Promise数组,数组中如有非Promise项,则此项当做成功
哪个Promise最快得到结果,就返回那个结果,无论成功失败

static race(promises) {
  // 返回一个新的MyPromise实例
  return new MyPromise((resolve, reject) => {
    // 遍历传入的Promise数组
    promises.forEach(promise => {
      // 检查当前项是否是MyPromise实例
      if (promise instanceof MyPromise) {
          promise.then(res => {
              resolve(res)
          }, err => {
              reject(err)
          })
      } else {
          resolve(promise)
      }
    })
  })
}

参考:

看了就会,手写Promise原理,最通俗易懂的版本!!!
09-手写Promise-Promise.all方法的实现

你可能感兴趣的:(#,面试,面试)