链式jQuery.then() -每个下一个只在前一个解析完成后执行
Chained jQuery.then() - is each next one executing only after previous resolve completely
我有这样的代码
$.when(
// I checked the first one and assume all return promises
datacontext.entity1.getPromise({ ...options... }),
datacontext.entity2.getPromise({ ...options... }),
datacontext.entity3.getPromise({ ...options... }),
datacontext.entity4.getPromise({ ...options... }),
datacontext.entity5.getPromise({ ...options... }),
datacontext.entity6.getPromise({ ...options... }),
datacontext.entity7.getPromise({ ...options... }), )
.then(
// some more similar calls returning promises
datacontext.entity8.getPromise({ ...options... }),
datacontext.entity9.getPromise({ ...options... }),
datacontext.entity10.getPromise({ ...options... }),
datacontext.entity11.getPromise({ ...options... }),
)
.then(function() {
// do work with the results
});
如果我理解正确的话,第一个then()
的执行应该在when()
中的所有延迟被解决之前才开始。对吗?我是否应该期望两个then()
部分相同-即// do work with the results
不应该在之前的then()
的所有调用都解决之前到达?在Chrome中似乎是真的,但在FF中,我在所有延迟解决之前击中了最后一个then()
。
那么根据评论,这是正确的链接方式吗?
$.when(
// I checked the first one and assume all return promises
datacontext.entity1.getPromise({ ...options... }),
datacontext.entity2.getPromise({ ...options... }),
datacontext.entity3.getPromise({ ...options... }),
datacontext.entity4.getPromise({ ...options... }),
datacontext.entity5.getPromise({ ...options... }),
datacontext.entity6.getPromise({ ...options... }),
datacontext.entity7.getPromise({ ...options... })
)
.then(function() {
$.when(
// some more similar calls returning promises
datacontext.entity8.getPromise({ ...options... }),
datacontext.entity9.getPromise({ ...options... }),
datacontext.entity10.getPromise({ ...options... }),
datacontext.entity11.getPromise({ ...options... })
)
.then(function() {
// do work with the results
});
})
在jQuery中,$.when
(和标准中的Promise.all
)接受一个承诺列表,并返回一个承诺,当所有的承诺都解决时,它就会解决。
.then
方法发出继续的信号,并接受一个完成和拒绝处理程序。当你从.then
返回一个承诺时,只有当返回的承诺被解决时,它才会继续。当你返回一个值,它将继续"立即"。
那么,你要做的就是从第二个then处理程序返回一个$.when
:
$.when(
// I checked the first one and assume all return promises
datacontext.entity1.getPromise({ ...options... }),
datacontext.entity2.getPromise({ ...options... }),
datacontext.entity3.getPromise({ ...options... }),
datacontext.entity4.getPromise({ ...options... }),
datacontext.entity5.getPromise({ ...options... }),
datacontext.entity6.getPromise({ ...options... }),
datacontext.entity7.getPromise({ ...options... }))
.then(function(){ // our handler, note that its params are the resolution values
return $.when( // which will resolve when this composite promise will resolve
// some more similar calls returning promises
datacontext.entity8.getPromise({ ...options... }),
datacontext.entity9.getPromise({ ...options... }),
datacontext.entity10.getPromise({ ...options... }),
datacontext.entity11.getPromise({ ...options... }),
)
})
.then(function() {
// do work with the results
});
如果我可以建议:
- 使用一个真正的承诺实现,jQuery延迟对象是非常有限的。
- 使用返回值而不是全局/闭包变量从承诺传递数据。
相关文章:
- jQuery-将列表项的一个元素移动到同一项的另一个元素中+对我的列表中的每个项执行此操作
- jQuery-在页面加载时执行一个函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何打开一个新窗口或选项卡,并将其提供给javascript执行
- 在Javascript中一个接一个地执行一个函数
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 你能用sound.js在播放声音文件后5秒执行一个动作吗
- 在页面内执行一个javascript函数作为last
- javascript下载一个文件并执行提交操作
- Rails 4、Turbolink在渲染一个部分后执行javascript
- 停止从另一个函数执行Javascript函数
- 如何生成一个执行AJAX调用的函数
- 执行一系列 Javascript 承诺一个接一个地解决
- 角度 2:使用一个 http 调用的结果来执行另一个调用
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- 从一个文本框执行代码,并在另一个文本框中以 HTML 显示输出
- 是节点.js一次只执行一个上下文
- 仅在堆栈中的最后一个执行回调
- JavaScript:一个接一个执行多个REST调用的正确方法
- post请求总是在angularjs函数的最后一个执行(不是按顺序执行)