promise核心总结

 

目录

 

前言

一、修改状态并保存结果

        1.'显式'修改状态

        2.'隐式'修改状态

        3.掌控promise2状态

二、onFulfilled或onRejected运行时机

三、promise解析过程

 


 

前言

        作为异步操作解决方案最佳实践,promsie在前端有着很高的地位,对promsie的核心进行一次提炼总结。

一、修改状态并保存结果

        1.'显式'修改状态

const promise1 =  new Promise((resolve,reject)=>{

        ...;

});

               对于promise1。因为可以通过resolve、reject修改promise1的状态并保存结果,所以我们对promise1的状态、结果具有非常强大的掌控力。可以非常明显的修改其状态并保存结果。

        2.'隐式'修改状态

const onFulfilled = ...;

const onRejected = ...;

const promise2 = promise1.then(onFulfilled,onRejected);

                对于promise2。由于并没有相应的resolve,reject供我们使用,导致我们对promise2的状态、结果没有一个很强的掌控力。只能比较隐蔽的修改其状态并保存结果。

        3.掌控promise2状态

                1)看promise1状态

                1.promise1的状态永远不改变; promise2的状态也永远不改变(永远是pending)...

                2.promise1的状态改变时;promise2状态走向确定,由onFulfilled或onRejected决定...

promise1的状态变为fulfilled时,promsie2的状态由onFufilled决定...

promise2的状态变为reject时,promise2的状态由onRejected决定...

                2)看onFulfilled、onRejected

                当promise1的状态改变后,promise2状态由onFulfilled或onRejected决定...

                 1.当promise1状态为fulfilled

                         ①onFulfilled不是函数;promise2以promise1相同的值为结果实现

                        ②onFulfilled是函数,但是调用报错error;promise2以报错信息为结果拒绝

相当于调用了关于promise2的reject:reject(error);

                        ③onFulfilled是函数,并且调用不报错;promise2状态由onFulfilled返回值x决定...

具体如何决定则是有promise解析程序(内部方法Resolve)决定,即运行:

[[Resolve]](promise2, x).

                 2.当promise1状态为reject

                        ①onFulfilled不是函数;promise2以promise1相同的值为结果拒绝

相当于调用了关于promise2的reject:reject(onReject);

                        ②onFulfilled是函数,但是调用报错error;promise2以报错信息为结果拒绝

相当于调用了关于promise2的reject:reject(error);

                        ③onFulfilled是函数,并且调用不报错;promise2状态由onFulfilled返回值x决定...

具体如何决定则是有promise解析程序(内部方法Resolve)决定,即运行:

[[Resolve]](promise2, x).

                总结:

                promsie2状态由promise1、onFulfilled或onReject决定。

①若onFulfilled或onReject不是函数,则:promise2与promise1保持一致

②若onFulfilled或onReject是函数但调用报错error,则:promise2以error为结果拒绝。

③若onFulfilled或onReject是函数且调用不报错返回值x,则:[[Resolve]](promise2, x)

二、onFulfilled或onRejected运行时机

        在onFulfilled或onRejected是函数的前提下,它们的运行时机由promsie状态决定。

        onFulfilled或onRejected(其中一个)最终会被包装为一个异步任务,在事件轮询的作用下主线程运行该任务时,该任务将promise的结果作为onFulfilled或onRejected(其中一个)的参数并调用它。

        promise.then注册onFulfilled、onRejec时,若promise状态未改变

等待promise状态变为fulfilled时;

        将onFulfilled们整体包装为一个异步任务,并将该任务添加到微队列中等待执行。在该异步任务中按注册顺序传参并调用onFulfilled。

等待promise状态变为reject时;

        将onRejected们整体包装为一个异步任务,并将该任务添加到微队列中等待执行,在该异步任务中按注册顺序传参并调用onRejected。

 

 

①按注册顺序将onFulfilled们包装为异步任务并添加到微队列中等待执行,形成多个异步任务。

②按注册顺序将onRejected们包装为异步异步任务并添加到微队列中等待执行,形成多个异步任务。

         promise.then注册onFulfilled、onRejec时,若promise状态已改变:

①状态为fulfilled;将onFulfilled包装为异步任务,并将该任务添加到微队列中等待执行。

②状态为reject;将onRejected包装为异步任务,并将该任务添加到微队列中等待执行。

三、promise解析过程

[[Resolve]](promise2, x);

        1.  若promise2 === x;则promsie2以TypeError为结果拒绝

29d31264740046b0abfe07c32111e145.png

        2.若x是promise;则promise2与x保持一致

        3.若x是对象或函数;则尝试检索并保存x.then。

                ①若检索失败error;则promise2以error为结果拒绝

                ②若x.then不是函数;则promsie2以x为结果实现

                ③若x.then是函数;则x.then(resolvePromise2,rejectPromise2)

        4.若x不是对象或函数;则promise2以x为结果实现

相当于调用了关于promise2的resolve:resolve(x);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值