【发布时间】: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