es5如何实现promise_彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)...

本文探讨了JavaScript中的异步问题和Promise作为解决方案的重要性。通过逐步讲解,作者用ES5语法实现了一个基本的Promise对象,解释了"回到过去"的概念,即通过setTimeout实现异步回调。接着,引入了状态管理,确保Promise只能从pending变为resolved或rejected。最后,实现了链式调用,确保then方法返回的值是Promise对象,以便进行后续的then调用。
摘要由CSDN通过智能技术生成

众所周知javascript语言的一大特色就是异步,这既是它的优点,同时在某些情况下也带来了一些的问题。最大的问题之一,就是异步操作过多的时候,代码内会充斥着众多回调函数,乃至形成回调金字塔。为了解决回调函数带来的问题,Promise作为一种更优雅的异步解决方案被提出,最初只是一种实现接口规范,而到了es6,则是在语言层面就原生支持了Promise对象。

最初接触Promise的时候,我觉得它是比较抽象并且令人困惑的,相信很多人也有同样的感觉。但是在后来的熟悉过程中,我慢慢体会到了它的优雅,并开始思考Promise对象实现的原理,最终用es5语法实现了一个具备基本功能的自己的Promise对象。在这篇文章中,会把自己实现的过程和思路循序渐进的记录一下,相信大家看完之后,也能够彻底理解Promise对象运行的原理,并在以后的开发中,能更熟练的使用它。

1. 回到过去: resolve, reject和then

首先来看一个Promise的使用实例:

var fn=function(resolve, reject){

console.log('begin to execute!');

var number=Math.random();

if(number<=0.5){

resolve('less than 0.5');

}else{

reject('greater than 0.5');

}

}

var p=new Promise(fn);

p.then(function(data){

console.log('resolve: ', data);

}, function(data){

console.log('reject: ', data);

})

这个例子当中,在fn当中产生一个0~1的随机数,如果小于等于0.5, 则调用resolve函数,大于0.5,则调用reject函数。函数定义好之后,用Promise包裹这个函数,返回一个Promise对象,然后调用对象的then方法,分别定义resolve和reject函数。这里resolve和reject比较简单,就是把传来的参数加一个前缀然后打印输出。

这里我们需要注意,当运行 p=new Promise(fn)这条语句的时候,fn函数就已经在执行了,然而,p.then这个方法是在后面才定义了resolve和reject,那么为何fn函数能够知道resolve和reject函数是什么呢?

换句话说,resolve和reject函数是如何回到过去,出现在先执行的fn函数当中的呢?这是Promise当中最重要的一个概念之一。

其实想要实现这个“黑科技”,方法也非常简单,主要运用的就是setTimeout这个方法,来延迟fn当中resolve和reject的执行。利用这个思路,我们可以初步写出一个自己的初级版Promise,这里我们命名为MyPromise:

function MyPromise(fn) {

this.value;

this.resolveFunc = function() {};

this.rejectFunc = function() {};

fn(this.resolve.bind(this), this.reject.bind(this));

}

MyPromise.prototype.resolve = function(val) {

var self = this;

self.value=val;

setTimeout(function() {

self.resolveFunc(self.value);<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值