美文网首页
Promise实现链式调用

Promise实现链式调用

作者: 前端_高手 | 来源:发表于2020-09-16 10:55 被阅读0次

上一篇文章实现了Promise最基础功能,本文将实现promise核心的链式调用

const PENDING_STATUS = 'pending';
const FULFILLED_STATUS = 'fulfilled';

class MyPromise {
   callBacks = [];// {onFulfilled, resolve}组合push到这个数组中
   state = PENDING_STATUS;// state初始状态
   value = null;// 保存resolve传递过来的参数

    constructor(fn) {
        fn(this.resolve)
    }

    then = (onFullfilled) => {
        return new MyPromise((resolve) => {
            this.handle({
                onFullfilled,
                resolve
            });
        });
    }

    handle = (cb) => {
        if(this.state === PENDING_STATUS) { // 异步的话就先存着,后面再执行
            this.callBacks.push(cb);
            return;
        }
        if (!cb.onFullfilled) {// onFullfilled如果是空,就把结果直接传给下一个then
            cb.resolve(this.value);
            return;
        }
        var ret = cb.onFullfilled(this.value);
        cb.resolve(ret);// 链式调用的关键,把返回结果传递给下一个resolve
        
    }

    resolve = (value) => {
        // resolve传过来的,除了数值,还有可能是上一个then返回的promise,下面这个if主要处理这种情况
        if (value && (typeof value === 'object' || typeof value === 'function')) {
            var then = value.then;
            if (typeof then === 'function') {
                then.call(value, this.resolve); // 如果是一个promise,则调用它的then
                return;
            }
        }
        this.state = FULFILLED_STATUS;
        this.value = value;
        this.callBacks.forEach(cb => {
            this.handle(cb);
        });
    }
}

// 链式调用的使用举例
const promise = new MyPromise((resolve) => {
    setTimeout(() => {
        resolve('第一个结果');
    },3000);
})
.then((result) => {
    return new MyPromise((resolve) => {
        setTimeout(() => {
            resolve(result + ' 第二个结果');
    }, 3000);
    });
})
.then((result) => {
    return new MyPromise((resolve) => {
        setTimeout(() => {
            resolve(result + ' 第三个结果');
    }, 3000);
    });
}).then((result) => {
    console.log(result);
});```

相关文章

  • 八(2)Promise模拟(姜) ------ 2020-05-

    1、基础的Promise的实现 2、实现then的链式调用

  • Promise实现链式调用

    上一篇文章实现了Promise最基础功能,本文将实现promise核心的链式调用

  • js promise图解

    链式调用 封闭promise

  • 嵌套的promise执行顺序

    外部promise有多个then链式调用,第一个then里面执行另一个promise,也带多个then链式调用,他...

  • Promise链式调用

    一、Promise对象 承诺一定会实现,更简单的处理异步请求。同时更加方便使用链式调用。缺点:Promise对象状...

  • Promise的简单实现

    随着ES6的出现,Promise成为标准,平时使用的次数也增加。但是Promise的原理是什么,如何实现链式调用。...

  • Promise链式调用

    做了一个博客项目,有一个过程如下: 封装request函数(用axios发送请求),axios会返回一个promi...

  • Promise 链式调用

    Promise status状态,有三种状态pendding、resolved、rejected,状态由 pend...

  • ES6

    AJAX 异步网络请求 Promise 使用了Promise对象之后可以链式调用的方式组织代码 Promise.a...

  • 手写Promise

    1. 简易版Promise,只能调用一次then,不能链式调用:

网友评论

      本文标题:Promise实现链式调用

      本文链接:https://www.haomeiwen.com/subject/iwycyktx.html