ECMAScript的承诺.all方法与jQuery.Deferred一起工作.为什么
ECMAScript Promise.all method works with jQuery.Deferred. Why?
我正在研究JavaScript中的Promises。我很感兴趣,我可以结合ECMAScript承诺与其他实现,例如jQuery $.Deferred
。我很惊讶,当Promises.all
工作良好与jQuery $.Deferred
。我试图在jQuery源代码和CommonJS承诺/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
的某个字段或方法来理解它是否被解析。这个方法/字段是什么?
promises A+规范(承诺展开规范基于原生承诺的使用)就是专门为此构建的。
为了使库能够很好地相互通信,规范是围绕一个方法构建的:.then
.
then方法指定了承诺的延续是如何工作的。jQuery承诺从1.8版本开始公开.then
,这意味着他们会尝试参与这个游戏。虽然jQuery的deferred和promises是而不是 promises/A+ promises——它们试图成为promises/A promise,这意味着:
return Promise.resolve($.get(...))
总是有效的。A+承诺(和本机承诺)将递归地吸收每个.then
表,并在返回它时使用它的值进行解析。
Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
console.log(el); // this logs 3
})
如果我们检查规格,可以看到:
让result为Invoke(nextPromise,
"then"
, (resolveElement, promiseCapability.[[Reject]])).
(也与此相关)
调用.then
并在.then
表解析
jQuery的deferred使用了一个非标准的promise实现,所以它不能使用原生promise(也就是说,你不能预测地$.when
一个原生promise)。反过来也行。
- 转义符不能与innerHTML一起使用
- 高亮显示与数组字符串一起使用时文本插件中断
- setTimeout可以与闭包内的函数一起使用吗
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- Highcharts colorsByPoint与系列中的线性渐变一起使用时不起作用
- 如何将js库与typescript一起使用
- 将webpack和babel与父项目目录中的文件一起使用
- 将 Drag&Drop 与 jsTree 和 DataTables 一起使用
- Javascript-如何让脚本与Ajax请求的数据一起运行
- 将两个ext.TabPanels滚动到一起
- 将jQuery UI Timepicker Addon与React一起使用
- 什么是curl以及如何将其与nodejs一起使用
- Javascript”;onmousemove”;事件无法与类一起使用
- 将require('..')与变量一起使用与在webpack中使用字符串相比
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 三角库可以与firefox一起使用,但不能在Chrome中使用
- 为什么不't我的ruby代码与javascript文件一起插入
- 通过jQueryAjax一起发布Array和Form数据时出现问题
- 如何将eventListeners与Angularjs+Electron一起使用
- ECMAScript的承诺.all方法与jQuery.Deferred一起工作.为什么