来自多个来源的Ajax请求,包括google api

时间:2013-12-19 20:17:25

标签: javascript html ajax promise jquery-deferred

我有一个问题,我试图找到一个解决方案。在前端我试图显示数据供用户在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的。

如果有更好的方法,我们很乐意尝试一下。

1 个答案:

答案 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);