ECMAScript Promise.all 方法与 jQuery.Deferred 配合使用。为什么?
-
22-12-2019 - |
题
我正在研究 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
原生的承诺。反之亦然。