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来理解是否解决了.那个方法/领域是什么?
承诺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原生的承诺.反之亦然.