一瓶肥宅水的时间,上手promise原理(1)

韩瑶
• 阅读 1057

一瓶肥宅水的时间,上手promise原理(1)

随着ES6的标准出现,promise就成为了处理异步操作的新宠,越来越多的前端工程师选择用promise来处理异步,解决回调地狱的方案。今天就来聊一聊promise的原理,自己手写实现promise。

1、我们可以确定的是promise是一个对象的形式被new出来。

class Promise {} 

2、我们要知道,在promise中有三种状态,分别为pending、fulfilled、rejected,代表等待,成功,失败。

class Promise {
    static PENDING = 'pending';
    static FULFILLED = 'fulfilled';
    static REJECTED = 'rejected';
} 

3、我们知道在new promise的时候 ,会在初始化时设置初始status,返回值,传入参数,这个参数是一个function,这个参数接受resolve,reject两个方法作为参数。

class Promise {
    static PENDING = 'pending';
    static FULFILLED = 'fulfilled';
    static REJECTED = 'rejected';
    constructor(executor){
        this.status = promise.PENDING;
        this.value = null;
       executor(this.resolve.bind(this),this.reject.bind(this))
    }
    resolve(value){
        this.status = Promise.FUFILLED;
        this.value=value;
    }
    reject(reason){
        this.status=Promise.REJECTED;
        this.value=reason
    }
} 

4、因为在promise中,状态是不可逆的,所以resolve和rejected需要添加判断,只有在状态为pending的情况才会去处理

resolve(value){
    if(this.status ==Promise.PENDING){
        this.status = Promise.FUFILLED;
        this.value=value;
    }
}
reject(reason){
    if(this.status == Promise.PENDING){
        this.status=Promise.REJECTED;
        this.value=reason
    }
} 

5、有种情况,在你初始化调用executor的时候,去console.log(不存在的值),会报错,我们应该j进行try...catch,将报错信息交给rejected来处理

try {
   executor(this.resolve.bind(this), this.reject.bind(this));
 } catch (error) {
   this.reject(error);
 } 

然后测试一下最基本的promise代码实现

<script src="HD.js"></script>
<script>
  let p = new Promise((resolve, reject) => {
    resolve("Hello world");
  });
  console.log(p);
</script>
点赞
收藏
评论区
推荐文章
Chase620 Chase620
4年前
Promise从入门到拿Offer之手写Promise
1、Promise构造函数的实现Promise构造函数用来声明示例对象,需要传入一个执行器函数。其中包括resolve函数和reject函数,以及几个重要的属性:状态属性、结果属性和回调函数队列。构造函数的基本框架resolve函数用于异步处理成功后调用的函数。其中包括验证对象状态修改次数,修改promise实例对象状态,异步调用成功的回调函数
Stella981 Stella981
3年前
Promise和Observable的映射
前言1.promise解决了嵌套地狱的问题,Observable解决了promise只有一个结果,和不可以取消的问题。2.使用的是rxjs6版本。3.这篇文章是方便使用Observable的API替换Promise的API。正常用法promise.then(result{}).ca
Stella981 Stella981
3年前
JavaScript中Promise 使用、原理以及实现过程
1.什么是Promisepromise是目前JS异步编程的主流解决方案,遵循Promises/A方案。2.Promise原理简析(1)promise本身相当于一个状态机,拥有三种状态pendingfulfilledrejected一个promise对象初始化时
Stella981 Stella981
3年前
ES6 Promise 让异步函数顺序执行
应用ES6的内置对象Promise,让异步函数按顺序执行的例子如下:!(https://oscimg.oschina.net/oscnet/9d7da385127c5df3cdf50b984cc4bca58c7.jpg)上边是四个用Promise处理过的异步执行的函数:fn1、fn2、fn3、fn4下面,让其按顺序执行
Stella981 Stella981
3年前
Promise的奇怪用法和自己实现一个Promise
原文链接: Promise的奇怪用法和自己实现一个Promise(https://my.oschina.net/ahaoboy/blog/4645165)使用Promise实现一个页面所有图片加载完毕的回调importReact,{useEffect}from"react";exportdefault()
Stella981 Stella981
3年前
Javascript 中的神器——Promise
_摘要:_ 回调函数真正的问题在于他剥夺了我们使用return和throw这些关键字的能力。而Promise很好地解决了这一切回调函数真正的问题在于他剥夺了我们使用return和throw这些关键字的能力。而Promise很好地解决了这一切Promise概念所谓Promise,就是ES6原生提供的一个
Stella981 Stella981
3年前
ES6中的Promise和Generator详解
简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更合理和更强大。所谓P
Stella981 Stella981
3年前
ES6 Promise 对象扯谈
newPromise(/executor/function(resolve,reject){...});Promise的构造函数接收一个函数作为参数,函数里面传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来
Stella981 Stella981
3年前
Promise 多重链式调用
Promise对象是用于异步操作的。Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调。如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢?使用Promise,我们就可以利用then进行「链式回调」,将异步操作以同步操作的流程表示出来。以下是个小Demo:/e.g/sen
Promise规范与原理解析 | 京东物流技术团队
Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。
京东云开发者 京东云开发者
6个月前
Promise规范与原理解析
作者:京东物流孙琦摘要Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。Promise出现的原因首先我们先来看一段代码:异步