资讯专栏INFORMATION COLUMN

Promise原理分析二

OnlyMyRailgun / 2944人阅读

摘要:原理分析一说明方法返回一个被拒绝的对象。实现创建一个新的对象,通过其构造函数的参数函数对象将状态变为。和使用解析值,同时通过构造函数的参数的函数对象触发的状态转变,其中使用数组记录返回值使用索引值以确保其返回值在结果集中的顺序。

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
});

参数

name desc
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
});

参数

name desc
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
});

参数

name desc
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
});

参数

name desc
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

资源 完整代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80845.html

相关文章

  • Promise原理分析

    摘要:原理分析一对象用于异步计算。它有两个参数,分别为在成功和失败情况下的回调函数。实现根据当前状态对回调函数进行处理,同时返回一个新的对象,以便链式调用。,注册回调函数到当前的对象中或,立即执行回调函数说明方法只处理被拒绝的情况,并返回一个。 Promise原理分析一 Promise对象用于异步计算。一个Promise对象代表着一个还未完成,但预期将来会完成的操作。 Note: Promi...

    WilsonLiu95 评论0 收藏0
  • 原理剖析(第 011 篇)Netty之服务端启动工作原理分析(下)

    摘要:原理剖析第篇之服务端启动工作原理分析下一大致介绍由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为原理剖析第篇之服务端启动工作原理分析上那么本章节就继续分析的服务端启动,分析的源码版本为二三四章节请看上一章节详见原理剖析第篇之 原理剖析(第 011 篇)Netty之服务端启动工作原理分析(下) - 一、大致介绍 1、由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为【原...

    Tikitoo 评论0 收藏0
  • promise/deferred 模式原理分析和实现

    摘要:三模式模式其实包含两部分和。六化在编码的时候,想要用进行异步操作流程控制,就要将当前的异步回调函数封装成。 一、什么是promise/deferred 模式 promise/deferred 模式是,根据promise/A 或者它的增强修改版promise/A+ 规范 实现的promise异步操作的一种实现方式。 异步的广度使用使得回调,嵌套出现,但是一但出现深度的嵌套,就会让codi...

    gclove 评论0 收藏0
  • javascript引擎执行的过程的理解--执行阶段

    摘要:如果对语法分析和预编译,还有疑问引擎执行的过程的理解语法分析和预编译阶段。参与执行过程的线程分别是引擎线程也称为内核,负责解析执行脚本程序的主线程例如引擎。以上便是引擎执行宏任务的整个过程。一、概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 1、语法分析: 分别对加载完成的代码块进行语法检验,语...

    Achilles 评论0 收藏0
  • javascript引擎执行的过程的理解--执行阶段

    摘要:如果对语法分析和预编译,还有疑问引擎执行的过程的理解语法分析和预编译阶段。参与执行过程的线程分别是引擎线程也称为内核,负责解析执行脚本程序的主线程例如引擎。以上便是引擎执行宏任务的整个过程。 一、概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 1、语法分析: 分别对加载完成的代码块进行语法...

    SnaiLiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<