剖析Promise内部结构

前言

阅读本文需要对promise有一定了解,可阅读详解promise

Promise标准解读

1.只有一个then方法,没有catchraceall等方法,甚至没有构造函数

Promise标准中仅指定了Promise对象的`then`方法的行为,其他常见的方法/函数都没有指定,包括`catch`,`race`,`all`等常用方法,甚至也没有指定该乳环构造一个Promise对象,而且`then`也没有一般实现中(Q,$q等)所支持的第三个参数,一般成为onProgress

2.then方法返回一个新的Promise

Promise的`then`方法返回一个新的Promise,而不是返回this,此处下文会有更多解释

1
2
promise2 = promise1.then(alert);
promise2 != promise1 //true

3.不同Promise的实现需要可以相互调用(interoperable)

4.Promise的初始状态为pending,它可以由此状态转换为fulfilled(也叫resolved)或者rejected,一旦状态确定,就不可以再转换为其他状态,状态确定的过程成为settle

5.更具体的标准

一步一步实现一个Promise

一步一步实现一个Promise

构造函数

标准中并没由指定如何构造一个Promise对象,在此以实现Promise的通用方法来构造一个Promise对象,即ES6原生Promise里所使用的方法:

1
2
3
4
5
6
7
//Promise构造函数接收一个executor函数,execuyor函数执行完同步或者异步操作后,调用它的两个参数resolve和reject
var promise = new Promise(function(resolve, reject) {
/*
如果操作成功,调用resolve并传入value
如果操作失败,调用reject并传入reason
*/
});

先实现构造函数的框架:

1
2
3
4
5
6
7
8
9
function Promise(executor) {
var self = this;
self.status = 'pending'; //Promise当前的状态
self.data = undefined; //Promise的值
self.onResolvedCallback = []; //Promise resolve时的回调函数
self.onRejectedCallback = []; //Promise reject时的回调函数

executor(resolve, reject); //执行executor并传入相应的参数
}

上面代码基本实现了Promise构造函数的主体,但还是有两个问题:

1.我们给executor函数传了两个参数:resolve和reject,这两个参数尚未定义

2.executor也有可能出错(throw),此时,Promise应该被其throw出的值reject:

1
2
3
new Promise(function(resolve, reject) {
throw 2;
})

所以我们需要在构造函数里定义resolve和reject这两个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Promise(executor) {
var self = this;
var self = this
self.status = 'pending' // Promise当前的状态
self.data = undefined // Promise的值
self.onResolvedCallback = [] // Promise resolve时的回调函数集,因为在Promise结束之前有可能有多个回调添加到它上面
self.onRejectedCallback = [] // Promise reject时的回调函数集,因为在Promise结束之前有可能有多个回调添加到它上面

function resolve(value) {
// TODO
}

function reject(reson) {
// TODO
}

try { //try/catch捕捉错误
executor(resolve, reject); //执行executor
} catch(e) {
reject(e);
}
}

原文

-------------本文结束感谢您的阅读-------------
显示 Gitment 评论