我有一个问题,我试图找到一个解决方案。在前端我试图显示数据供用户在HTML表格中进行比较。有三个数据源使用Ajax请求从中获取数据。
数据源1:时间约为8秒 数据源2:时间约为8秒 数据源3:时间约为30秒
我的方法 - Ajax调用是在一个函数中进行的,如下所示: -
function fetchAjax(){
aggregatedAjaxObj = {}
ajax.request1(){
}
ajax.request2(){
}
ajax.request3(){
}
//Add all the response in the aggregatedAjaxObj Object.
}
function render(){
// render the object in the html table & display after a interval of 30 sec
}
使用Node.js,Backbone js& Jquery的。
如果有更好的方法,我们很乐意尝试一下。
答案 0 :(得分:2)
你这里有一个race condition并且引入了30秒的延迟。此外,你有全球状态。
这两者都非常不可靠和糟糕。
假设你不想使用你已经拥有的工具引入一个好的promises库(我推荐bluebird),可以使用它来完成:
使用jQuery:
var request1 = $.ajax(...);
var request2 = $.ajax(...);
var request3 = $.ajax(...);
$.when(request1,request2,request3).done(function(results){
// results contains all 3 request data
// no delay, will resolve when all 3 are done
// requests are made simultaneously
render(results);
});
使用标准Promise(Bluebird兼容):
var request1 = $.ajax(...);
var request2 = $.ajax(...);
var request3 = $.ajax(...);
Promise.all(request1,request2,request3).then(function(results){
// results contains all 3 request data
// no delay, will resolve when all 3 are done
// requests are made simultaneously
render(results);
});
lambda总是可以离开,你可以这样做:
Promise.map(["url1","url2","url3"],$.get).all(render);