目录
前言
作为异步操作解决方案最佳实践,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解析过程
1. 若promise2 === x;则promsie2以TypeError为结果拒绝。
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);