promise
构建异步请求在 es6-promise
中已经说过了,下面这章想要探究一下使用 promise
的原理。使用 promise
的实例如下:new Promise(function (resolve, reject) {....})
对于 promise
的执行过程是这样的:executor 执行器:executor 是一个带有对于一个resolve
和reject
两个参数的函数,executor
函数promise
构造函数执行的时候同步执行, 被传递resolve
以及reject
函数,executor
函数在Promise
构造函数返回新建对象前被调用,resolve
和reject
函数被调用的时候,分别将promise
的状态改为fullfilled(完成)
和rejected(完成)
executor
函数内部会执行异步操作,操作完成成功之后将promise
状态改为fullfiled
或者将发生错误的时候, 将 状态变为rejected
promise
对象具有下面三种状态:1 | pending: 初始状态,不是成功就是失败 // pending 英文: 等待,表示处于等待异步处理结果的状态 |
promise
进行调用的状态图:
promise
代码
构建 Promise
构造函数
es6
:1 | let p = new Promise((resovle, reject) => { |
1 | function Promise (executor) { |
改变状态函数
es6
:1 | resolve(value); |
1 | Promise.prototpe.transition = function (status, value) { |
then
es6
: 1 | p.then(onFulFilled, onRejected); |
1 | Promise.prototype.then = function (onFulfilled, onRejected) { |
process
处理函数
用来执行成功时的回调函数以及失败的回调函数。 es6
: 1 | p.then(function () { |
1 | // 使用 process 的主要目的是执行保存在 this.handlerQueue 中的函数 |
resolve
resovle
函数用于函数执行完毕之后改变状态:1 | function resovle(promise, x) { |
promsie.resolve
对于实现代码如下:promise.resolve
的状态,存在下面几种情况:
- 如果参数是 Promise 实例,那么
Promise.resolve
将不做任何修改、原封不动地返回这个实例。- 如果参数是一个具有
then
方法的对象, 使用promise.resolve
会将这个对象转化为promise
对象,并且立即执行thenable
对象的then
方法。- 如果参数是一个原始值,或者是一个不具有
then
方法的对象,则Promise.resolve
方法返回一个新的 Promise 对象,状态为resolved
。- 如果不带参数, 直接返回一个
resolve
状态的 Promise 对象。
1 | Promise.resolve = function(value) { |
promise.reject
1 | Promise.reject = function(reason) { |
Promise.reject
接收的参数 reason
会被作为 error
传递 other
1 | // 定义 promise 的三种状态 |