7
Promise.resolve = function (value) {  
  //返回一个Promise  
  return new Promise((resolve, reject) => {  
    //如果value是Promise,value的结果就是return promise的结果  
  if(value instanceof Promise){  
      value.then(resolve, reject)  
    } else{  
      //直接返回成功  
      reject(value)  
    }  
  })  
}
Promise.reject = function (reason) {  
  //返回一个失败的Promise  
  return new Promise((resolve, reject) => {  
    reject(reason)  
  })  
}
Promise.all = function (promises) {  
  //保存所有已成功的promise的结果,最大长度已确定  
  const resolvedValues = new Array(promises.length)  
  //计数,已成功的promise的个数  
  let resolvedCount = 0  
  //返回一个promise  
  return new Promise((resolve, reject) => {  
    //遍历promises,成功了就记录下来,有一个失败就返回失败  
  promises.forEach((item, index) => {  
      //用上前面定义的resolve方法  
  Promise.resolve(item).then(  
    value => {  
      //数量+1  
      resolvedCount ++  
      //保存成功的结果,不能用push,要保证结果顺序和Promises的元素顺序一致  
      resolvedValues[index] = value  
      //当成功数量和promises的长度一致时,全部成功  
      if(resolvedCount === promises.length){  
         resolve(resolvedValues)  
        }  
      },  
    reason => {  
      //有一个失败就返回失败promise  
      reject(reason)  
        }  
      )  
    })  
  })  
}
Promise.race = function (promises) {  
  return new Promise((resolve, reject) => {  
    promises.forEach((item, index) => {  
      Promise.resolve(item).then(  
        //由第一个完成的promise的结果决定return的promise的结果  
        value => {  
          resolve(value)  
        },  
        reason => {  
          reject(reason)  
        }  
      )  
    })  
  })  
}
代码已同步更新到github

https://github.com/hnt815/promise

Promise系列文章

Promise从两眼发懵到双眼放光(1)-准备篇
Promise从两眼发懵到双眼放光(2)-Promise基础
Promise从两眼发懵到双眼放光(3)-Promise的几个关键问题(一)
Promise从两眼发懵到双眼放光(4)-Promise的几个关键问题(二)
Promise从两眼发懵到双眼放光(5)-手写Promise之整体结构
Promise从两眼发懵到双眼放光(6)-手写Promise之构造函数
Promise从两眼发懵到双眼放光(7)-手写Promise之then方法和catch方法
Promise从两眼发懵到双眼放光(8)-手写Promise之resolve,reject,all,race方法
Promise从两眼发懵到双眼放光(9)-async和await


ntyang
165 声望29 粉丝

非典型性代码搬运工,搞点儿事情