Promise学习并手写一个Promise


一、Promise介绍与基本使用?

什么是Promise

Promise 是ES6提供异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。可以解决之前异步操作产生的回调地狱问题。

Promise的基本使用

  • 对象的三种状态
    Pending状态(进行中)
    Fulfilled状态(已成功)
    Rejected状态(已失败)
  • 创建Promise实例
    let p = new Promise((resolve,reject)=>{
        if('异步操作成功'){
            resolve(value)
        }else{
            reject(error)
        }
    })

调用resolve()使得状态Pending -> Fulfilled
调用reject()使得状态Pending -> Rejected

  • then和catch方法
    Promise实例生成后,可用then方法分别指定两种状态回调参数。then 方法可以接受两个回调函数作为参数。catach方法只能接收失败的回调
  • finally()
    无论成功还是失败状态都会执行这个函数。

    let p = new Promise((resolve, reject) => {
        if (false) {
            resolve("成功")
        } else {
            reject("失败")
        }
    })
    p.then((value) => {
        console.log(value);
    }, (reason) => {
        console.log(reason);
    }).catch(e=>{
        console.log(e);
    })

二、常用的API

Promise.resolve()

  • 传入的参数如果为非Promise对象,返回一个成功状态的Promise对象。
  • 传入的参数如果是Promise对象,则参数的结果将影响返回的结果。
    let p1 = Promise.resolve('521')
    let p2 = Promise.resolve(new Promise((resolve, reject) => {
        resolve("成功")
    }))
    let p3 = Promise.resolve(new Promise((resolve, reject) => {
        reject("失败")
    }))

    console.log(p1,p2,p3);
    p1.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })
    p2.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })
    p3.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })

在这里插入图片描述

Promise.reject()

该方法返回的永远都是失败状态的Promise对象。值为传入的参数。

    let p1 = Promise.reject('521')
    let p2 = Promise.reject(new Promise((resolve, reject) => {
        resolve("成功")
    }))
    let p3 = Promise.reject(new Promise((resolve, reject) => {
        reject("失败")
    }))

    console.log(p1,p2,p3);
    p1.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })
    p2.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })
    p3.then(value => {
        console.log(value);
    }).catch(reason => {
        console.log(reason);
    })

在这里插入图片描述

Promise.all()

  • **参数:**可接收多个Promise对象(或非Promise对象)形成的数组。
  • ** 返回值:**返回一个Promise对象。

如果参数数组中全为成功状态的Promise对象,则返回一个成功的Promise对象,值为所有Promise的值组成的数组;

    function createPromise(message, type = true) {
        return new Promise((resolve, reject) => {
                if (type) {
                    resolve(message)
                } else {
                    reject(message)
                }

        })
    }

    const p1 = createPromise("楼德华")
    const p2 = createPromise("涨削油")
    const p3 = createPromise("犁明")
    const p4 = createPromise("锅扶城")

    console.log(Promise.all([p1, p2, p3, p4]));

在这里插入图片描述

如果参数中有失败状态的Promise对象,则返回第一个失败的Promise对象。

    function createPromise(message, type = true) {
        return new Promise((resolve, reject) => {
                if (type) {
                    resolve(message)
                } else {
                    reject(message)
                }

        })
    }

    const p1 = createPromise("楼德华")
    const p2 = createPromise("涨削油")
    const p3 = createPromise("犁明",false)
    const p4 = createPromise("锅扶城")

    console.log(Promise.all([p1, p2, p3, p4]));

在这里插入图片描述

Promise.race()

  • **参数:**可接收多个Promise对象(或非Promise对象)形成的数组。
  • ** 返回值:**返回一个Promise对象。返回状态最先改变的那个Promise对象。
    function createPromise(message, delay, type = true) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                if (type) {
                    resolve(message)
                } else {
                    reject(message)
                }
            }, delay)

        })
    }

    const p1 = createPromise("楼德华",2000)
    const p2 = createPromise("涨削油",3000)
    const p3 = createPromise("犁明", 1000)
    const p4 = createPromise("锅扶城",3000)

    console.log(Promise.race([p1, p2, p3, p4]));

在这里插入图片描述

三、手写Promise

Promise

function Promise(executor) {
        this.promiseState = "pending"
        this.promiseResult = null
        this.callbacks = []
        const self = this
        //修改状态为成功
        function resolve(data) {
            if (self.promiseState === 'pending') {
                self.promiseState = "fulfilled"
                self.promiseResult = data
                //传入的参数可能是个异步任务,会先执行.then()或.catch(),将多个结果保存下来等待修改状态时执行
                self.callbacks.forEach(item => {
                    if (item.onResolve) {
                        item.onResolve()
                    }
                })
            }
        }
        //修改状态为失败
        function reject(data) {
            if (self.promiseState === 'pending') {
                self.promiseState = "rejected"
                self.promiseResult = data
                self.callbacks.forEach(item => {
                    if (item.onReject) {
                        item.onReject()
                    }
                })
            }
        }
        try {   //如果throw xxx 直接返回一个值为xxx的失败状态的Promise对象
            executor(resolve, reject)
        } catch (e) {
            reject(e)
        }

    }

Promise.then

Promise.prototype.then = function (onResolve = value => value, onReject = (reason) => { throw reason }) {
        //保存this
        const self = this
        //返回一个Promise
        return new Promise((resolve, reject) => {
            function callback(type) {
                try {
                    let result = type(self.promiseResult)
                    //判断传入的是不是Promise对象
                    if (result instanceof Promise) {
                        result.then(v => {
                            resolve(v)
                        }, r => {
                            reject(r)
                        })
                    } else {
                        resolve(result)
                    }
                } catch (e) {
                    reject(e)
                }
            }
            if (this.promiseState === 'fulfilled') {
                callback(onResolve)
            }
            if (this.promiseState === 'rejected') {
                callback(onReject)
            }
            //异步保存,修改状态后执行
            if (this.promiseState === 'pending') {
                this.callbacks.push({
                    onResolve: function () {
                        callback(onResolve);
                    },
                    onReject: function () {
                        callback(onReject);
                    }
                }
                )

            }
        })
    }

Promise.catch

    Promise.prototype.catch = function (onReject) {
        return this.then(undefined, onReject)
    }

Promise.resolve

Promise.resolve = function (value) {
        return new Promise((resolve, reject) => {
            try {
                if (value instanceof Promise) {
                    value.then(v => {
                        resolve(v)
                    }, r => {
                        reject(r)
                    })
                } else {
                    resolve(value)
                }
            } catch (e) {
                reject(e)
            }
        })
    }

Promise.reject

Promise.reject = function (resaon) {
        return new Promise((resolve, reject) => {
            try {
                if (resaon instanceof Promise) {
                    resaon.then(v => {
                        reject(v)
                    }, r => {
                        reject(r)
                    })
                } else {
                    reject(resaon)
                }
            } catch (e) {
                reject(e)
            }
        })
    }

Promise.all

Promise.all = function (promises) {
        return new Promise((resolve, reject) => {
            let arr = []
            promises.forEach((item, index) => {

                if (item instanceof Promise) {
                    item.then(value => {
                        arr[index] = value
                        if (arr.length = promises.length) {
                            resolve(arr)
                        }
                    }, reason => {
                        reject(reason)
                    })
                } else {
                    arr[index] = item
                }

            })
        })

    }

Promise.race

Promise.race = function (promises) {
        return new Promise((resolve, reject) => {
            promises.forEach((item, index) => {
                item.then(value => {
                    resolve(value)
                }, reason => {
                    reject(reason)
                })


            })
        })
    }

继续完善中。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您提供一个手写Promise 实现,代码如下: class Promise { constructor(executor) { this.state = 'pending'; this.value = undefined; this.reason = undefined; this.onResolvedCallbacks = []; this.onRejectedCallbacks = []; const resolve = (value) => { if (this.state === 'pending') { this.state = 'fulfilled'; this.value = value; this.onResolvedCallbacks.forEach((fn) => fn()); } }; const reject = (reason) => { if (this.state === 'pending') { this.state = 'rejected'; this.reason = reason; this.onRejectedCallbacks.forEach((fn) => fn()); } }; try { executor(resolve, reject); } catch (error) { reject(error); } } then(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (value) => value; onRejected = typeof onRejected === 'function' ? onRejected : (reason) => { throw reason }; const promise2 = new Promise((resolve, reject) => { if (this.state === 'fulfilled') { setTimeout(() => { try { const x = onFulfilled(this.value); Promise.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); } if (this.state === 'rejected') { setTimeout(() => { try { const x = onRejected(this.reason); Promise.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); } if (this.state === 'pending') { this.onResolvedCallbacks.push(() => { setTimeout(() => { try { const x = onFulfilled(this.value); Promise.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); }); this.onRejectedCallbacks.push(() => { setTimeout(() => { try { const x = onRejected(this.reason); Promise.resolvePromise(promise2, x, resolve, reject); } catch (error) { reject(error); } }, 0); }); } }); return promise2; } static resolvePromise(promise2, x, resolve, reject) { if (promise2 === x) { return reject(new TypeError('Chaining cycle detected for promise')); } let called = false; if (x instanceof Promise) { x.then((value) => { Promise.resolvePromise(promise2, value, resolve, reject); }, reject); } else if (x !== null && (typeof x === 'object' || typeof x === 'function')) { try { const then = x.then; if (typeof then === 'function') { then.call(x, (value) => { if (called) return; called = true; Promise.resolvePromise(promise2, value, resolve, reject); }, (reason) => { if (called) return; called = true; reject(reason); }); } else { resolve(x); } } catch (error) { if (called) return; called = true; reject(error); } } else { resolve(x); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值