25.Promise原理及实现

上一篇文章 24.Promises/A+ 规范 介绍了Promises/A+ 规范,我们来手动实现一个符合 Promises/A+ 规范的自己的Promise。

根据规范,Promise 共有三种状态 pendingfulfilledrejected,我们使用 state 来表示 promise 当前的状态,使用 value 来表示当前原因。当然还有最重要的 then 方法。同时我们还需要一些辅助函数,比如 isFunction

1234567891011121314151617181920212223242526272829
const PENDING = 0;const FULFILLED = 1;const REJECTED = 2;

function  () {  this.state = PENDING;  // 值或原因  this.value = void 0;}

Promise.prototype.then = function (onFulfilled, onRejected) {  // 2.2.1  if (isFunction(onFulfilled) || isFunction(onRejected)) {    this.onFulfilled = onFulfilled;    this.onRejected = onRejected;  }  // 根据2.2.7,  // then必须返回一个 promise,但它还有其他的规则,  // 这里我们先不管,直接返回当前 promise  return this;};

function isFunction (func) {  return typeof func === 'function';}function isObject(obj) {  return typeof obj === 'object';}

接着,我们定义两个函数,可以将 promise 转换为 fulfilledrejected

1234567891011121314151617181920212223242526
function doResolve (promise, value) {  promise.state = FULFILLED;  promise.value = value;

  if (isFunction(promise.onFulfilled)) {    // 2.2.4    // 需要确保onFulfilled和onRejected的异步执行,    // 是在调用then的事件轮训时间片之后,且调用栈为空。    // 更多详情可看http://one-pieces.me/2018/11/14/24-Promises-A-%E8%A7%84%E8%8C%83/#3-%E6%B3%A8%E9%87%8A    setTimeout(() => {      promise.onFulfilled(promise.value);    }, 0);  }  return promise;}function doReject (promise, reason) {  promise.state = REJECTED;  promise.value = reason;  if (isFunction(promise.onRejected)) {    setTimeout(() => {      promise.onRejected(promise.value);    }, 0);  }

  return promise;}

最后,我们还需要一个 resolver,将刚才定义的 doResolvedoReject 暴露给 Promise 的构造函数。想想我们平时是怎么 new 一个 Promise的?

12345678910111213141516171819
function safelyResolveThen(promise, then) {  try {    then(function (value) {      doResolve(promise, value);    }, function (reason) {      doReject(promise, reason);    })  } catch (e) {    doReject(promise, e);  }}

// 然后修改 Promise 构造函数function  (resolver) {  this.state = PENDING;  // 值或原因  this.value = void 0;  safelyResolveThen(this, resolver);}

到这里,Promise 最核心的功能已经实现。可以很容易地看出,这里 Promise 的底层实现使用了回调(callback)

原文:大专栏  25.Promise原理及实现

原文地址:https://www.cnblogs.com/chinatrump/p/11607050.html

时间: 2024-10-18 09:32:17

25.Promise原理及实现的相关文章

Promise 原理

剖析 Promise 之基础篇 从JavaScript的事件循环到 理解 Promise 的工作原理 Promise原理 Promise的实现原理 Promise原理解析 深入 Promise(一)--Promise 实现详解 JS Promise的实现原理 深入了解promise的原理 原文地址:https://www.cnblogs.com/yancongyang/p/8949910.html

这一次,彻底弄懂 Promise 原理

Promise 必须为以下三种状态之一:等待态(Pending).执行态(Fulfilled)和拒绝态(Rejected).一旦Promise 被 resolve 或 reject,不能再迁移至其他任何状态(即状态 immutable). 基本过程: 初始化 Promise 状态(pending)执行 then(..) 注册回调处理数组(then 方法可被同一个 promise 调用多次)立即执行 Promise 中传入的 fn 函数,将Promise 内部 resolve.reject 函数作

Promise 原理探究及其简单实现

可移步 http://donglegend.com/2016/09/11/promise%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ 观看 Promise是个什么玩意,大家都知道,度娘告诉我,以同步方式书写异步,解决回调地狱... 状态机 早闻Promise的大名,简单介绍,根据状态改变来执行相应处理函数.Promise的状态极其简单,只有 “pending”, “resolved”, “rejected”三种状态然后就是如何实现的问题,最关键的当然是监听到状态的更

Promise原理讲解 async+await应用(异步回调解决方案)

1.异步编程 1.1.回调函数 1.2 发布订阅 1.3 观察者模式 1.4 Promise 2.promise用法与原理 2.1 Promise.prototype.then() 2.2 Promise.prototype.catch() 2.3 Promise.all 2.4 Promise.race 2.5 Promise.resolve 2.6 Promise.reject 2.7 promise的一些扩展库 2.8 应用 async + await = generator + co 3

摘抄 Promise原理

1.简单的promise: //极简promise雏形 function Promise(fn){ var value = null; callbacks = [];//callback为数组,因为可以同时有很多个回调 this.then = function(onFulfilled){ callbacks.push(onFulfilled); } function resolve(value){ callbacks.forEach(function(callback){ callback(va

Promise实现原理

这两天在熟悉 kissy框架的时候,看到了 Promise 模块. Promise 对于一个Jser并不陌生, Promise 类似于一个事务管理器,它的作用就是将各种内嵌回调的事务用流水形式表达.利用 Promise 可以让异步编程更符合人的直觉,让代码逻辑更加清晰,把开发人员从回调地狱中释放出来.这么“高大上”的东西,以前写 nodejs 代码的时候只是简单的用用,还没有理解其基本的实现原理,罪过!个人认为,理解编程思想最好的途径就是阅读一份简易的实现源码.很幸运,网上有不少 Promise

全面理解Javascript中Promise

全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非常有趣的Promise Promise概念 2015 年 6 月,ECMAScript 6 的正式版 终于发布了. ECMAScript 是 JavaScript 语言的国际标准,javascript 是 ECMAScript 的实现.ES6 的目标,是使得 JavaScript 语言可以用来编写大

细嗅Promise

读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是页面异步操作指数般增长,如果不能恰当的控制代码逻辑,我们就会陷入无穷的回调地狱中. ECMAScript 6 已经将异步操作纳入了规范,现代浏览器也内置了 Promise 对象供我们进行异步编程,那么此刻,还在等啥?赶紧学习学习 Promise 的内部原理吧! 第一章 了解 Promise 一.场景

JavaScript进阶之路——认识和使用Promise,重构你的Js代码

一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半年的单身生活.大家一起加油~~ 一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深入人心.在设计API的时候,不管是浏览器厂商还是SDK开发商亦或是各种类库的作者,基本上都已经遵循着callback的套路.近几年随着JavaScript开发模式的逐渐成