>我的jQuery移动网站上有一个设置页面 当用户单击保存按钮时,我会为3种不同的用户输入更新服务器,即语言,货币,阈值
为了做到这一点,我做了3个单独的ajax调用(用PUT)。因此,当所有内容都成功时,如果其中任何一个失败,我会转到另一个页面,我会停留在同一页面上并显示错误消息。
问题是我只想在所有调用都成功的情况下切换页面,并且如果有任何错误,我想显示一个包含所有消息的警报(而不是 3 个单独的警报窗口),所以我需要等待所有这些调用的结果。
为了在我使用的所有 3 个 Ajax 调用中实现这一点;
async:false
我在所有这些调用成功方法中都放了一个布尔值;
success: function (data){
languageUpatesuccesful=true;
}
然后像这样;
if(languageUpatesuccesful){
make the next call to update currency..etc
}
。
if(allsuccesful(){
changepage();
}
因此,我可以跟踪一个呼叫何时完成,然后我进行下一个呼叫,如果所有成功切换到另一个页面。
虽然这有效,但我认为这是一个可怕的解决方案,有没有办法通过使用 async:true 来实现这一点?
因为禁用异步 ajac 会冻结页面,我什至无法显示动画,所以 jQuery 也不建议这样做。但是,我怎么知道这 3 个调用何时完成并根据结果采取行动呢?
延迟对象与$.when
一起使用:
$.when(ajax1(), ajax2(), ajax3()).done(function() {
// all Ajax calls successful, yay!
}).fail(function() {
// oh noes, at least one call failed!
});
其中ajaxX
定义为:
function ajax1() {
return $.ajax(...);
}
如果您确实想链接 Ajax 调用而不是让它们并发,请查看 Bergi 的解决方案。
您可以使用延迟接口轻松链接它们:
$.ajax({…})
.then(function(languageUpateResult) {
return $.ajax({…});
})
.then(function(currencyUpdateResult) {
return $.ajax({…});
})
.then(function(thresholdUpdateResult) {
changePage();
});
抱歉,我跳过了 ajax 调用是分开的事实。上面的代码按顺序执行它们,如果你只想并行执行它们并等待它们全部完成使用$.when()
- 请参阅@FelixKling的答案。
您可以尝试使用 Web 辅助角色在后台线程中执行异步调用。 Web工作者有很好的浏览器支持,应该可以解决您的问题。如果您有兴趣,我已经编写了 Web worker 库的一些抽象,以使它们更容易使用(只需给我发送一个 pm)。