Promise道理剖析二

Promise道理剖析二

前面我们剖析了Promise的thencatch要领,接下来我们一起来看看rejectresolveraceall要领的完成。

Note:

Promise道理剖析一

reject

申明

Promise.reject(reason)要领返回一个被谢绝的Promise对象。

语法

Promise.reject(new Error('something wrong')).then(null, err => {
  // todo
});

Promise.reject(new Error('something wrong')).catch(err => {
  // todo
});

参数

namedesc
reason被谢绝的缘由。

完成

建立一个新的Promise对象,经由过程其组织函数的参数reject函数对象将状况变成rejected

static reject(reason) {
  return new Promise((resovle, reject) => {
    reject(reason);
  });
}

resolve

申明

Promise.resolve(value)要领返回一个以给定值剖析后的Promise对象。但假如这个值是个Promise对象,返回的Promise会采用它的终究状况;不然以该值为胜利状况返回promise对象。

语法

Promise.resolve(1000).then(value => {
  // todo
});

参数

namedesc
value用来剖析待返回Promise对象的参数。(可所以一个Promise对象)

完成

假如是一个Promise对象,直接返回该值;不然建立一个新的Promise对象,经由过程其组织函数的参数resolve函数对象将状况变成fulfilled

static resolve(value) {
  // 假如为Promise对象,直接返回当前值
  if (value instanceof Promise) {
    return value;
  }

  return new Promise(resovle => {
    resovle(value);
  });
}

race

申明

Promise.race(values)返回一个Promise对象,这个Promise在values中的恣意一个Promise被处置惩罚或谢绝后,马上以雷同的处置惩罚值被处置惩罚或以雷同的谢绝缘由被谢绝。

语法

Promise.race([p1, p2]).then(value => {
  // todo
}, reason => {
  // todo
});

参数

namedesc
values一个Array对象。

完成

运用Promise.resolve对迭代对象值举行剖析,且将新Promise的参数resolvereject函数对象通报给then要领,以触发新Promise对象的状况转换。

static race(values) {
  // 校验values参数是不是为数组
  if (!isArray(values)) {
    return Promise.reject(new Error('Promise.race must be provided an Array'));
  }

  return new Promise((resovle, reject) => {
    values.forEach(value => {  // 遍历迭代对象
      // 运用Promise.resolve剖析value值(可能为Promise对象或其他值)
      // 将新Promise对象的resolve, reject通报给剖析后的Promise.prototype.then
      Promise.resolve(value).then(resovle, reject);
    });
  });
}

all

申明

Promise.all(values)要领返回一个Promise对象,该Promise会等values参数内的一切值都被resolve后才被resolve,或以values参数内的第一个被reject的缘由而被reject。

语法

Promise.all([p1, p2]).then(values => {
  // todo
});

参数

namedesc
values一个Array对象。

完成

经由过程Promise.resolve对迭代对象值举行剖析,运用数组纪录values参数的一切值被剖析后的效果,当一切值剖析后resolve,并通报其一切剖析效果。同时通报reject函数对象给Promise.resolve().then参数,以触发新Promise对象的状况转换。

static all(values) {
  // 校验values参数是不是为数组
  if (!isArray(values)) {
    return Promise.reject(new Error('Promise.all must be provided an Array'));
  }

  return new Promise((resolve, reject) => {
    // 假如数组长度为0,直接resolve且完毕处置惩罚
    if (values.length === 0) {
      resolve([]);
      return;
    }

    const len = values.length;
    // 建立一个数组用来保留values的Promise返回值
    const result = new Array(len);
    let remaining = len;

    // 处置惩罚values数组中的值
    function doResolve(index, value) {
      Promise.resolve(value).then(val => {
        // 将剖析后的Promise返回值保留在对应索引的效果集合
        result[index] = val;

        // 当values的一切值都剖析完后,挪用新Promise对象的resolve函数要领,
        // 把一切返回值result通报给后续处置惩罚中,且将状况转换为fulfilled。
        if (--remaining === 0) {
          resolve(result);
        }
      }, reject);
    }

    // 迭代values对象,通报其索引位置以确保效果值的递次
    for (let i = 0; i < len; i++) {
      doResolve(i, values[i]);
    }
  });
}

总结

Promise.rejectPromise.resolve经由过程Promise的组织函数完成状况改变。

Promise.racePromise.all运用Promise.resolve剖析values值,同时经由过程组织函数的executor参数的函数对象触发Promise的状况改变,个中Promise.all运用数组纪录返回值、运用索引值以确保其返回值在效果集合的递次。

症结知识点

Promise

MDN

资本

完全代码

    原文作者:Pluser
    原文地址: https://segmentfault.com/a/1190000007438417
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞