【问题标题】:ECMAScript Promise.all method works with jQuery.Deferred. Why?ECMAScript Promise.all 方法适用于 jQuery.Deferred。为什么?
【发布时间】:2014-09-23 13:00:21
【问题描述】:

我正在研究 JavaScript 中的 Promises。我很有趣可以将 ECMAScript Promises 与其他实现结合起来,例如 jQuery $.Deferred。当Promises.all 与 jQuery $.Deferred 一起工作时,我感到很惊讶。我试图在 jQuery 源代码和 CommonJS Promises/A 规范中找到答案,但我仍然误解了为什么这段代码按我的预期工作(在 10 秒后执行 console.log,而不是 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 的某些字段或方法来了解是否已解决。那个方法/字段是什么?

【问题讨论】:

  • 我对你到底在问什么感到困惑。 jQuery 的 deferred 显然使用现有的 Promise 实现作为其实现行为的方式。 jQuery 就是 JavaScript,为什么你觉得很奇怪?
  • 你传入deferred,即使它不是一个有效的promise,它也会用promise.cast转换成一个,所以它应该可以工作。
  • Promise.all 必须依赖 $.Deferred 的某些字段或方法来了解是否已解决。那个方法/字段是什么?
  • @adeneo in jQuery a $.Deferred() 有一个 then 方法(无论出于何种原因)
  • @Pinal 方法或字段是 .then - 概念是 .thenable。

标签: javascript jquery promise jquery-deferred es6-promise


【解决方案1】:

promises A+ 规范(promise 解包规范基于原生 promises 的使用)专门为此而构建。

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

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

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

将始终有效。 A+ 承诺(和原生承诺)将递归地同化每个 .thenable,并在您返回它时解析它的值。

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

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

result 为 Invoke(nextPromise, "then", (resolveElement, promiseCapability.[[Reject ]]))。

(同样相关的是this

调用.then 并在.thenable 解析时解析下一项

jQuery 的 deferred 使用非标准的 Promise 实现,因此它不能使用本机 Promise(也就是说,您无法预测 $.when 一个本机 Promise。相反的方法也可以。

【讨论】:

  • 琐事:这就是该规范在过去被称为thenables 的原因。
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多