手写promise

const PENDING = 'pending'const RESOLVED = 'resolved'const REJECTED = 'rejected'function MyPromise(fn) {  // 保留初始化状态  var self = this  // 初始化状态  this.state = PENDING  // 用于保留 resolve 或者 rejected 传入的值  this.value = null  // 用于保留 resolve 的回调函数  this.resolvedCallbacks = []  // 用于保留 reject 的回调函数  this.rejectedCallbacks = []  // 状态转变为 resolved 办法  function resolve(value) {    // 判断传入元素是否为 Promise 值,如果是,则状态扭转必须期待前一个状态扭转后再进行扭转    if (value instanceof MyPromise) {      return value.then(resolve, reject)    }    // 保障代码的执行程序为本轮事件循环的开端    setTimeout(() => {      // 只有状态为 pending 时能力转变,      if (self.state === PENDING) {        // 批改状态        self.state = RESOLVED        // 设置传入的值        self.value = value        // 执行回调函数        self.resolvedCallbacks.forEach((callback) => {          callback(value)        })      }    }, 0)  }  // 状态转变为 rejected 办法  function reject(value) {    // 保障代码的执行程序为本轮事件循环的开端    setTimeout(() => {      // 只有状态为 pending 时能力转变      if (self.state === PENDING) {        // 批改状态        self.state = REJECTED        // 设置传入的值        self.value = value        // 执行回调函数        self.rejectedCallbacks.forEach((callback) => {          callback(value)        })      }    }, 0)  }  // 将两个办法传入函数执行  try {    fn(resolve, reject)  } catch (e) {    // 遇到谬误时,捕捉谬误,执行 reject 函数    reject(e)  }}MyPromise.prototype.then = function (onResolved, onRejected) {  // 首先判断两个参数是否为函数类型,因为这两个参数是可选参数  onResolved =    typeof onResolved === 'function'      ? onResolved      : function (value) {          return value        }  onRejected =    typeof onRejected === 'function'      ? onRejected      : function (error) {          throw error        }  // 如果是期待状态,则将函数退出对应列表中  if (this.state === PENDING) {    this.resolvedCallbacks.push(onResolved)    this.rejectedCallbacks.push(onRejected)  }  // 如果状态曾经凝固,则间接执行对应状态的函数  if (this.state === RESOLVED) {    onResolved(this.value)  }  if (this.state === REJECTED) {    onRejected(this.value)  }}

手写Promise.all()

Promise.all = function(iterator) {  if (!Array.isArray(iterator)) return;  let count = 0;  let res = [];  return new Promise((resolve, reject) => {    for(let item of iterator) {      Promise.resolve(item)      .then(data => {        res[count++] = data;        if (count === iterator.length) {          resolve(res);        }      })      .catch(e => {        reject(e);      })    }  })}// testlet p1 = Promise.resolve(3);let p2 = 4;let p3 = new Promise(resolve => {  setTimeout(resolve, 100, 'lee')  // setTimeout的第三个往后参数都是用来作为第一个参数也就是函数的参数,也就是其实是setTimeout(resolve('lee'), 100)});Promise.all([p1, p2, p3]).then(data => {  console.log(data);})

手写Promise.race()

Promise.race = function(iterator) {  return new Promise((resolve, reject) => {    for(let item of iterator) {      Promise.resolve(item)      .then(data => {        resolve(data)      })      .catch(e => {        reject(e)      })    }  })}let p1 = new Promise(resolve => {  setTimeout(resolve, 105, 'p1 done')})let p2 = new Promise(resolve => {  setTimeout(resolve, 100, 'p2 done')})Promise.race([p1, p2]).then(data => {  console.log(data); // p2 done})