ECMAScript Promise.all方法适用于jQuery.Deferred.为什么?

Pin*_*nal 6 javascript jquery promise jquery-deferred es6-promise

我正在研究JavaScript中的Promises.我很有兴趣将ECMAScript Promises与其他实现结合起来,例如jQuery $.Deferred.当Promises.alljQuery工作正常时,我感到很惊讶$.Deferred.我试图在jQuery源代码和CommonJS Promises/A规范中找到答案,但我仍然误解了为什么这段代码按照我的预期工作(console.log10秒后做,不是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
});
Run Code Online (Sandbox Code Playgroud)

你有什么想法?

Promise.all必须依靠某些领域或方法$.Deferred来理解是否解决了.那个方法/领域是什么?

Ben*_*aum 8

承诺A +规范(承诺展开规范基于本机承诺使用的规范)是专门为此而构建的.

由于库的设计目标很好,规范是围绕一个方法构建的:.then.

then方法指定promise的延续如何工作.jQuery承诺.then从版本1.8开始暴露,这意味着他们试图参与这个游戏.虽然jQuery延迟和承诺不是 Promises/A +承诺 - 但它们试图成为Promises/A promises,意思是:

return Promise.resolve($.get(...))
Run Code Online (Sandbox Code Playgroud)

永远都会奏效.A + promises(和本机承诺)会.then递归地同化每个能量,并在返回时以其值解析.

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

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

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

(也与有关)

.then.then能够结算时,调用并解析下一个项目

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