【从0-1分析Promise,并手写一个Promise】

// Promise使用

 const test = new Promise((resolve, reject)=> {
     setTimeout(()=> {
         resolve('请求成功')
     }, 2000)
 })
 test.then((value)=> {
     console.log(value, '7777')
 })

// 思路:
// 1. 首先promise是一个类, 传入一个方法,执行回调,导出 resolve跟reject 方法故结构应该是

class myPromise {
    constructor(callback) {
        const reslove = ()=> {};
        const reject = ()=> {};
        callback(reslove, reject);
    }
}

**

// 2. promise 有三个状态 pending、fulfilled、rejected 故现在的结构应该是 // reslove
时又传入一个value值, 故需要用一个 result值来储存结果 // reject 时传入错误信息 同样可以存储到
result值来储存结果 // 在reslove , reject 只有pending时才会执行。 且执行后会改变当前promise的状态
故需要修改promise状态

**

class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'fulfilled';
        };
        callback(reslove, reject);
    }
}

// 3. 在callback执行时,程序错误也需要错误返回调用 reject方法

class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'fulfilled';
        };
        try {
            callback(reslove, reject);
        } catch (error) {
            reject(error);
        }
    }
}

到此处 promise 的功能已经实现了, 但是一般情况下还需要使用.then拿到结果,
第一种办法 用promise.then

直接赋值给自己的promise.then
第二种就是要自己手写.then方法
思路:

  1. .then 接受两个函数
    一个是正常执行调用函数 onResolved, 一个是异常调用函数 onRejected // .then方法返回的是一个promise对象
    故首先返回的结构应该是 // return ney myPromise () // myPromise 会调用 reslove , reject
class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'fulfilled';
        };
        try {
            callback(reslove, reject);
        } catch (error) {
            reject(error);
        }
    }
    then(onResolved, onRejected) {
        return new myPromise ((reslove , reject)=> {
        });
    }
}

// 在状态 fulfilled 时才会调用 传入的正常执行事件, rejected 执行异常事件

class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'rejected';
        };
        try {
            callback(reslove, reject);
        } catch (error) {
            reject(error);
        }
    }
    then(onResolved, onRejected) {
        return new myPromise ((reslove , reject)=> {
            if(this.state === 'fulfilled') {
                onResolved();
            }
            if(this.state === 'rejected') {
                onRejected();
            }
        });
    }
}

此时问题来了, then 返回的reslove , reject何时执行,故应该有一个方法去调用reslove , reject 同时把结果返回

class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'rejected';
        };
        try {
            callback(reslove, reject);
        } catch (error) {
            reject(error);
        }
    }
    then(onResolved, onRejected) {
        return new myPromise ((resolve , reject)=> {
            const handleCallback = (func)=> {
               try {
                let res = func(this.result);
                if(res instanceof Promise) {
                    res.then(val => resolve(val), err => reject(err));
                } else {
                    resolve(res);
                }
               } catch (error) {
                reject(error)
               }
            }
            if(this.state === 'fulfilled') {
                handleCallback(onResolved);
            }
            if(this.state === 'rejected') {
                onRejected(onResolved);
            }
        });
    }
}

// 此时如果调用执行时,会立即执行, this.state的状态应该是pending, 应该让它一直调用 直到状态改变后返回

class myPromise {
    constructor(callback) {
        this.state = 'pending'; // 默认状态
        this.result = undefined; // 结果存储
        this.callbackList = [];  // 事件列表
        const reslove = (value)=> {
            if(!this.state === 'pending') return;
            this.result = value;
            this.state = 'fulfilled';

            // 异步执行所有回调函数
            this.callbackList.forEach(cb => cb.onResolved(value));
        };
        const reject = (error)=> {
            if(!this.state === 'pending') return;
            this.result = error;
            this.state = 'rejected';
            // 异步执行所有回调函数
            this.callbackList.forEach(cb => cb.onRejected(value));
        };
        try {
            callback(reslove, reject);
        } catch (error) {
            reject(error);
        }
    }
    
    then(onResolved, onRejected) {
        return new myPromise ((resolve , reject)=> {
            const handleCallback = (func)=> {
               try {
                let res = func(this.result);
                if(res instanceof Promise) {
                    res.then(val => resolve(val), err => reject(err));
                } else {
                    resolve(res);
                }
               } catch (error) {
                reject(error)
               }
            }
            if(this.state === 'fulfilled') {
                handleCallback(onResolved);
            }
            if(this.state === 'rejected') {
                onRejected(onResolved);
            }

            if(this.state === 'pending') {
                // 新增
                this.callbackList.push({
                    onResolved: () => {
                        handleCallback(onResolved)
                    },
                    onRejected: () => {
                        handleCallback(onRejected)
                    }
                })
            }
        });
    }
}

// 调用模块
const test = new myPromise((resolve, reject)=> {
    setTimeout(()=> {
        resolve('请求成功')
    }, 200)
}).then((value)=> {
    console.log(value, '7777')
})
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码手写一个 `Promise.all` 函数: ``` function PromiseAll(promises) { return new Promise((resolve, reject) => { if (!Array.isArray(promises)) { return reject(new TypeError('Promise.all requires an array')); } const results = []; let remaining = promises.length; function resolver(index) { return value => { resolveAll(index, value); }; } function rejecter(reason) { reject(reason); } function resolveAll(index, value) { results[index] = value; if (--remaining === 0) { resolve(results); } } for (let i = 0; i < promises.length; i++) { Promise.resolve(promises[i]).then(resolver(i), rejecter); } }); } ``` 该函数接受一个包含多个 Promise 实例的数组,并返回一个新的 Promise 实例。如果传入的不是一个数组,则返回一个 reject 状态的 Promise 实例,并将一个 TypeError 作为原因。 如果传入的数组中的所有 Promise 都是 fulfilled 状态,则返回的 Promise 实例也是 fulfilled 状态,并将所有 Promise 的返回值作为一个数组传递给它的回调函数。如果传入的数组中至少有一个 Promise 是 rejected 状态,则返回的 Promise 实例也是 rejected 状态,并将第一个被 reject 的 Promise 的原因作为参数传递给它的回调函数。 你可以像使用标准的 `Promise.all` 函数一样使用这个函数。例如: ``` PromiseAll([promise1, promise2, promise3]).then(values => { console.log(values); // [value1, value2, value3] }).catch(reason => { console.error(reason); }); ``` 希望这对你有帮助! ### 回答2: Promise.all是JavaScript中的一个方法,用于将多个Promise对象封装为一个新的Promise对象。当所有的Promise状态都变为resolved时,返回的Promise才会变为resolved状态;如果有任意一个Promise被rejected,返回的Promise就会变为rejected状态。 下面是一个手写Promise.all的简单实现: ```javascript function myPromiseAll(promises) { return new Promise((resolve, reject) => { // 传入的参数不是数组或者为空,则直接返回resolved状态的Promise if (!Array.isArray(promises) || promises.length === 0) { return resolve([]); } let count = 0; const resultArray = []; for (let i = 0; i < promises.length; i++) { Promise.resolve(promises[i]) .then((result) => { resultArray[i] = result; count++; // 当所有Promise都变成resolved状态时,返回结果数组 if (count === promises.length) { resolve(resultArray); } }) .catch(reject); // 有任意一个Promise被rejected,则返回rejected状态的Promise } }); } ``` 这个手写Promise.all方法接受一个Promise数组作为参数。首先判断传入的参数是否为一个数组,若不是数组或为空,则直接返回一个resolved状态的Promise,并将结果数组设置为空数组。 接着,定义一个计数器count,用于记录已经变为resolved状态的Promise的数目。同时创建一个空数组resultArray,用于存储每个Promise的结果。 使用for循环遍历传入的Promise数组,调用Promise.resolve方法将每个Promise对象转换为Promise类型,以确保每个元素都是一个Promise对象。 在每个Promise对象上调用then方法,当其状态变为resolved时,将结果存入resultArray数组,并将计数器加1。当所有的Promise都变为resolved状态时,通过调用resolve方法返回结果数组。 如果有任意一个Promise被rejected,就会调用catch方法,并将错误信息传给reject方法,返回一个rejected状态的Promise。 这个手写Promise.all实现了基本的功能,用于同时处理多个Promise对象,并可以根据情况返回resolved或rejected状态的Promise。 ### 回答3: Promise.all是一个用于并行执行多个promise的方法,当所有的promise都变为resolved状态时,它才会变为resolved状态,并返回一个包含所有promise结果的数组;如果其中一个promise变为rejected状态,那么Promise.all也会变为rejected状态,并返回第一个被rejected的promise的错误信息。 下面是一个简单的手写Promise.all的示例: ```javascript function myPromiseAll(promises) { return new Promise((resolve, reject) => { const results = []; let count = 0; for (let i = 0; i < promises.length; i++) { promises[i].then((result) => { results[i] = result; count++; if (count === promises.length) { resolve(results); } }).catch((error) => { reject(error); }); } }); } ``` 这个手写Promise.all接受一个包含多个promise的数组作为参数,通过循环遍历每一个promise,使用then方法处理其resolved状态的情况,将结果保存到results数组中,并通过计数器count来判断是否所有的promise都已完成。当所有的promise都完成时,调用resolve方法将结果传递给外部;如果有任何一个promise被rejected,通过catch方法捕捉错误并调用reject方法将错误信息传递给外部。 这只是一个简单的手写Promise.all示例,实际上,Promise.all还有很多其他的功能和细节需要考虑,例如处理空数组或非promise值的情况,以及对结果顺序的保持等,但以上代码可以作为一个基本的示例来理解Promise.all的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值