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 的三种状态 |