手写一个promise函数,实现then 的链式调用和值的穿透特性

本文介绍了Promise的基本特性和状态变化,并详细讲解了如何手写一个简单的Promise,重点在于实现then方法的链式调用及值穿透特性。通过示例代码展示了Promise的创建、then方法的参数处理以及异常处理机制。最后,文章提到还需要实现promise.all和promise.race等方法,鼓励读者发现并指出可能存在的问题。
摘要由CSDN通过智能技术生成

第一步来了解一下promise的基本特性;

1、promise 有三个状态:pendingfulfilled,or rejected

2、new promise时, 需要传递一个executor()执行器,接受两个参数,分别是resolvereject,并执行器立即执行;

3、promise 的默认状态是 pending;

4、promise 有一个value保存状态的值,成功或失败;

5、promise 只能从pendingrejected, 或者从pendingfulfilled,状态一旦确认,就不会再改变;

6、promise 必须有一个then方法,then 接收两个参数,分别是 promise 成功的回调 onFulfilled, 和 promise 失败的回调 onRejected,参数都是value;

7、如果then中抛出异常,那么就会把这个异常作为参数,传递给下一个 then 的失败的回调onRejected,如果没有这个回调函数,则到catch方法中;

写一个简单的promise

const p1 = new Promise((resolve, reject) => {
  console.log('create a promise');
  setTimeout(() => {
        resolve('成功了');
  }, 3000)
})

p1.then(data => {
  console.log(data)
})

//输出
create a promise
成功了

实现代码如下

class promise {
    constructor(executor) {
        //三种状态
        this.statusArr = ['pending', 'fulfilled', 'rejected'];
        this.status = 'pending';
        //存一个值;默认undefined
        this.result = void 0;
        if (typeof executor === 'function') {
            //
            this.resolve = (res) => {
                this.status = 'fulfilled';
                if (this.await_fn) {
                    this.await_fn(res)
                } else {
                    this.result = res;
                }
            };
            //由于resolve是一个微任务;改为 添加setTimeout
            this.resolve = (res) => {
                setTimeout(() => {
                    this.status = 'fulfilled';
                    if (this.await_fn) {
                        this.await_fn(res)
                    } else {
                        this.result = res;
                    }
                }, 0)
            };
            this.reject = (res) => {
                this.status = 'rejected';
                if (this.catch_fn) {
                    this.catch_fn(res)
                } else {
                    this.result = res;
                }
            };
            executor(this.resolve, this.reject);

            this.then = (fn) => {
                if (this.status === 'fulfilled') {
                    fn(this.result)
                } else {
                    this.await_fn = fn;
                }
            }
            this.catch = (fn) => {
                if (this.status === 'rejected') {
                    fn(this.result)
                } else {
                    this.catch_fn = fn;
                }
            }

        } else {
            console.error(`${executor} should be a function`)
        }
    }
}

const p1 = new promise((res, rej) => {
    console.log('create a promise')
    se
当可以,以下是一个简单的串行执行 Promise函数实现: ```javascript function serialPromise(promises) { let result = Promise.resolve(); promises.forEach(promise => { result = result.then(() => promise()); }); return result; } ``` 使用示例: ```javascript // 定义三个异步函数 function asyncFunc1() { return new Promise(resolve => { setTimeout(() => { console.log('Async function 1'); resolve(); }, 1000); }); } function asyncFunc2() { return new Promise(resolve => { setTimeout(() => { console.log('Async function 2'); resolve(); }, 2000); }); } function asyncFunc3() { return new Promise(resolve => { setTimeout(() => { console.log('Async function 3'); resolve(); }, 1500); }); } // 定义一个包含异步函数的数组 const asyncFuncs = [asyncFunc1, asyncFunc2, asyncFunc3]; // 串行执行异步函数 serialPromise(asyncFuncs) .then(() => { console.log('All promises completed'); }) .catch(error => { console.error('Error:', error); }); ``` 上述代码中,`serialPromise` 函数接收一个包含异步函数的数组 `promises`。它通过初始化一个 resolved 状态的 Promise 对象 `result`,然后依次使用 `then` 方法将每个异步函数串行执行。最后返回最终的 Promise 对象 `result`。在示例中,我们定义了三个异步函数,并将它们存储在 `asyncFuncs` 数组中。通过调用 `serialPromise(asyncFuncs)`,我们实现了按照顺序依次执行这三个异步函数,输出结果为: ``` Async function 1 Async function 2 Async function 3 All promises completed ``` 请注意,上述代码只是一个基本的串行 Promise 实现示例,实际应用中可能需要更多的错误处理和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值