Defer 中返回的 promise 同 promise 构造函数的区别

用 Q 来举例,Q.defer().promise 返回的 promise 是不带和控制状态相关的 方法/属性的,而如果我们直接输出 Q.promise,会发现它是有 resolve/reject 的。

那么问题来了,defer 返回的 promise 和我们常见的 promise 有何区别?为什么要这么设计?

阅读 6.1k
1 个回答

Q.defer().promise 才是 "我们常见的 promise". Q.Promise/promise 只是一个 promise 的构建函数/静态方法的shorthand.

参考源代码片段:

Q.Promise = promise; // ES6
Q.promise = promise;
function promise(resolver) {
    if (typeof resolver !== "function") {
        throw new TypeError("resolver must be a function.");
    }
    var deferred = defer();
    try {
        resolver(deferred.resolve, deferred.reject, deferred.notify);
    } catch (reason) {
        deferred.reject(reason);
    }
    return deferred.promise;
}

promise.race = race; // ES6
promise.all = all; // ES6
promise.reject = reject; // ES6
promise.resolve = Q; // ES6

至于为什么要这么设计, 别人乐意呗, 根据 Promises/A+ 标准, 只规定了 promise 的 then 以及相关行为, 对怎样修改当前 promise 的 state 是没有限制的. 我的 Promises/A+ 实现 (ThenFail) reject/resolve 就是挂在 Promise 的实例而不是 deferred 上的.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进