function Promise(fn) {
var value = null,
deferreds = [];
this.then = function (onFulfilled) {
deferreds.push(onFulfilled);
};
function resolve(value) {
deferreds.forEach(function (deferred) {
deferred(value);
});
}
fn(resolve);
}
Promise 做了以下几件事情
- 定义了通过 then 添加回调函数
- 定义了触发回调执行的 resolve 方法
- 把2中定义的 resolve 传入 fn 中,并执行 fn,而 fn里面会在特定的时间执行 resolve
此外,Promises/A+ 规范明确要求回调需要通过异步方式执行,用以保证一致可靠的执行顺序。为解决这两个问题,可以通过 setTimeout 将 resolve 中执行回调的逻辑放置到 JS 任务队列末尾:
对于 then 的改进
this.then = function (onFulfilled) {
if (state === 'pending') {
deferreds.push(onFulfilled);
return this;
}
onFulfilled(value);
return this;
};
后续添加的回调也可以立即执行 还是没写完 下次再继续吧