Ashley’s Blog

A blogging framework for Ashley.

Promise Part 1

Read from Here

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 做了以下几件事情

  1. 定义了通过 then 添加回调函数
  2. 定义了触发回调执行的 resolve 方法
  3. 把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;
};

后续添加的回调也可以立即执行 还是没写完 下次再继续吧