我正在研究 JavaScript 中的 Promise。我很有趣我可以将 ECMAScript Promises 与其他实现结合起来,例如 jQuery $.Deferred. 。我很惊讶 Promises.all 与 jQuery 配合良好 $.Deferred. 。我试图在 jQuery 源代码和 CommonJS Promises/A 规范中找到答案,但我仍然误解了为什么这段代码按我的预期工作(做 console.log 10 秒后,而不是 5 秒后):

var promise = new Promise(function (resolve, reject) {
    setTimeout(function () { 
        resolve();//resolve first promise after 5 secs
        console.log('Promise resolved');
    }, 5000);
});

var deferred = $.Deferred();
setTimeout(function () { 
    deferred.resolve();//resolve after 10 seconds
    console.log('Deferred resolved');
}, 10000);

Promise.all([promise,deferred]).then(function () {
    console.log('All is done');//log after 10 seconds
});

你有什么想法?

Promise.all 必须依赖于某些领域或方法 $.Deferred 了解是否解决了。该方法/字段是什么?

有帮助吗?

解决方案

Promise A+ 规范(Promise 展开规范基于本机 Promise 使用的规范)是专门为此构建的。

为了实现库互操作良好的设计目标,该规范是围绕单一方法构建的: .then.

then 方法指定 Promise 的延续如何工作。jQuery 承诺公开 .then 从1.8版本开始,这意味着他们尝试参与这个游戏。虽然 jQuery 的延迟和承诺是 不是 Promises/A+ 承诺 - 他们试图成为 Promises/A 承诺,这意味着以下内容:

return Promise.resolve($.get(...))

永远会工作。A+ 承诺(和原生承诺)将吸收每一个 .then能够递归地并在返回时解析它的值。

Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
    console.log(el); // this logs 3
})

如果我们检查 规格 , 我们可以看到:

结果 被调用(下一个承诺, "then", (解析元素, 承诺能力。[[拒绝]]))。

(也相关的是 )

哪个调用 .then 并解决下一个项目 .then能够解决

jQuery 的 deferred 使用非标准的 Promise 实现,因此它不能消耗本机 Promise(也就是说,你无法预测 $.when 原生的承诺。反之亦然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top