6

我正在研究 JavaScript 中的 Promises。我很有趣我可以将 ECMAScript Promises 与其他实现结合起来,例如 jQuery $.DeferredPromises.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来理解它是否解决。那个方法/字段是什么?

4

1 回答 1

8

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

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

then 方法指定了一个 promise 的延续是如何工作的。jQuery 承诺.then从 1.8 版本开始公开,这意味着他们尝试参与这个游戏。虽然 jQuery deferreds 和 Promise不是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
})

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

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

(也相关的是这个

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

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

于 2014-07-31T14:30:24.290 回答