- 假设自定义Promise类名为HD
- 首先定义HD中的三种状态:
pending
、fulfilled
、rejected
javascript
1 | class HD { |
- 接着咱们来写HD中的构造函数
- 首先来看一下是如何创建一个HD对象的javascript
1
2
3
4
5
6
7
8
9const myFirstPromise = new Promise((resolve, reject) => {
// 做一些异步操作,最终会调用下面两者之一(任务完成之后的回调函数):
//将任务结果通过调用resolve函数或reject函数包装成一个Promise对象
// resolve(someValue); // fulfilled
// 或
// reject("failure reason"); // rejected
}); - 所以构造函数得传过去
resolve
和reject
函数javascript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class HD {
constructor(executor) {
//把状态改为初始状态
this.status = HD.PENDING;
this.value = null;
try {
// 调用这个函数
executor(this.resolve.bind(this), this.reject.bind(this));
} catch (error) {
***//如果中间出现error,修改为reject状态
this.reject(error);
}
}
}
- 书写
resolve
函数
1.resolve
函数要完成的工作:将这个HD对象的状态改为`FULFILLED` 将这个HD对象的值改为value
javascript1
2
3
4
5
6
7
8
resolve(value) {
//状态只可以修改一次
if (this.status == HD.PENDING) {
this.status = HD.FULFILLED;
this.value = value;
}
}
- 书写
reject
函数
1.reslove
函数要完成的工作:将这个HD对象的状态改为`REJECTED` 将这个HD对象的值改为value
javascript1
2
3
4
5
6reject(reason) {
if (this.status == HD.PENDING) {
this.status = HD.REJECTED;
this.value = reason;
}
}
- 书写
then
- 判断是否有传入
onFulfilled
和onRejected
函数javascript1
2
3
4
5
6
7
8
9
10then(onFulfilled, onRejected) {
//如果不传onFulfilled或onRejected函数,要进行判断
if (typeof onFulfilled != "function") {
//因为要执行链式操作,所以直接返回this.value
onFulfilled = () => this.value;
}
if (typeof onRejected != "function") {
onRejected = () => this.value;
}
} - 当前状态为准备状态
因为有异步,如果上一次操作的结果没有出来,直接来调用then
,当前的状态就为准备状态。
所以咱们可以先把需要调用的onFulfilled
函数和onRejected
函数保存到一个数组中,等到上一次操作结果出来之后,再去调用这两个函数
javascript
1 | constructor(executor) { |
javascript
1 | then(onFulfilled, onRejected) { |
javascript
1 | //最后咱们从新修改resolve和reject函数 |
- 如果当前的状态为成功或失败状态
javascript
1 | then(onFulfilled, onRejected) { |
- 书写
parse
javascript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/*
js中不允许以下操作:
let promise = new Promise((resolve, reject) => {
resolve("解决");
});
let p = promise.then(value => {
return p; //因为是异步操作,所以这个p早就有了,不允许返回这个p
});
*/
parse(promise, result, resolve, reject) {
//如果创建的promise对象和结果相同,抛出错误
if (promise == result) {
throw new TypeError("Chaining cycle detected");
}
try {
//判断传过来的是否是HD对象
if (result instanceof HD) {
result.then(resolve, reject);
} else {
resolve(result);
}
} catch (error) {
reject(error);
}
}
- 书写静态
resolve
方法
javascript
1 | /* 就是 |
- 书写
reject
方法
javascript
1 | static reject(value) { |
- 书写
all
方法
javascript
1 | /** |
- 书写
race
方法javascript1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26//谁快用谁
/**
* HD.race([p1, p2]).then{
* value => {
* console.log(value);
* },
* reason => {
* console.log(reason);
* }
* }
*/
static race(promises) {
//返回一个HD对象,resolve和reject是刚才的静态方法
return new HD((resolve, reject) => {
promises.map(promise => {
promise.then(
value => {
resolve(value);
},
reason => {
reject(reason);
}
);
});
});
}
完整代码:
javascript
1 | class HD { |