Promise的封装二
优化一:把几个状态转为const常量,避免书写错误
1
2
3
4const PENDING = 'pending'
const RESOLVED = 'resolved'
const REJECTED = 'rejected'优化二:添加 检测是否是函数 如果不是函数,直接抛出错误
1
2
3
4//检测传入的是否是一个函数 如果不是 直接抛出一个错误
if (typeof executor !== 'function') {
throw new TypeError(`Promise resolver ${executor} is not a function`)
}优化三: 链式调用,原型的then函数要返回一个Promise
1
2
3
4
5
6Promise.prototype.then = function() {
//返回一个promise 以便于以后链式调用
return new Promise((resolve, reject) => {
})
}四: 需要一个handel来处理 then中promise的resolve和reject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 处理函数
function handel(callback) {
try {
const result = callback(this.date)
//需要判断result是否是promise
//1.result是promise 可以调用该promise的then函数 在其then函数中 调用promise中的resolve把结果返回
if (result instanceof Promise) {
result.then(
value => resolve(value),
reason => reject(reason)
)
} else {
//result不是promise对象
resolve(result)
}
} catch (error) {
reject(error)
}
}优化五:给Promise.prototype.then函数的参数添加默认值 (链式调用的关键)
1
Promise.prototype.then = function (onResolved = res => res, onRejected = reason => { throw reason }) {}
完整代码:
1 | <!-- promise --> |
测试代码:(已支持链式调用)
1 | <!-- 测试代码 --> |
未完待续…..
经过一小时,我又来了
继续
实现Promise.resolve和Promise.reject
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//构造函数的方法resolve
Promise.resolve = function (value) {
return new Promise((resolve, reject) => {
if (value instanceof Promise) {
value.then(resolve, reject)
} else {
resolve(value)
}
})
}
//构造函数的方法reject
Promise.reject = function (reason) {
return new Promise((resolve, reject) => {
reject(reason)
})
}测试代码
1
2
3
4
5
6
7
8
9
10
11
12var p = Promise.resolve(1)
var p1 = Promise.reject(2)
var p2 = Promise.resolve(Promise.reject(3))
p.then(res => {
console.log(res);
})
p1.catch(err => {
console.log(err)
})
p2.catch(err => {
console.log(err);
})
未完待续…哈哈哈
我又来了,隔了一天
我带来了完整版的手写Promise
1 | <!DOCTYPE html> |