Open lihongjie0209 opened 3 years ago
这样我们就保证了一个链式调用, 然后通过监听器来赋值
P.prototype.onResolve = function (success, fail) {
let ret = new P();
if (success) {
this.valueListener.push(function (value) {
let tmp;
try {
tmp = success.call(null, value);
} catch (e) {
ret.setError(e);
return;
}
if (tmp instanceof P) {
tmp.onResolve(value => ret.setValue(value), error => ret.setError(error));
} else {
ret.setValue(tmp);
}
});
}
return p;
只需要在setValue中调用一下监听器, 调用完成之后清空队列就可以了
P.prototype.setValue = function (value) {
this.value = value;
this.valueListener.forEach(l => l.call(null, value))
this.valueListener = []
}
Promise中的回调都是异步的, 实现起来也比较简单, 只需要把上面的foreach放在settimeout 中就可以了
promise在设值之后是不能再次设值的, 为了实现这个需求, 我们需要加一个状态字段, 表明当前的状态
比如:
0: 未设值 1: 已设值
我们在set方法中判断一下状态就可以了
Promise 是什么
Promise 是一个容器, 一个单值容器
和List之类的容器有什么区别
List 之类的集合他们的值都是静态的, 但是Promise的值是不确定的, 这个不确定有
Promise 是什么
Promise {
var value; var error; // 错误对象
}
Promise 有什么接口
按照上面的数据结构, 我们大概可以设计出来
Promise 中如何实现设置值或者错误的时候回调
很简单 实现一个监听者模式就可以了
首先注册回调函数
然后在set方法中调用listener