多个get请求jquery

时间:2013-11-21 04:06:49

标签: javascript jquery ajax arrays get

我正在尝试将几个url作为文本读入,并使用jquery的ajax / get将它们存储到数组中。我需要等待获取所有数据(并推送到数组),然后在函数中返回它。从我在网上看到的,这是不可能的。

我想如果我设置一个全局数组变量并在每次获得新数据时将其推入,那么如果数组已经饱和,则返回时使用while循环进行检查。见下文

您可以假设所有错误都在get电话

中处理
function fetchData(){
   x = [1,2,3,4,5,6,7,8,9,10];
   a = [];

   //Loop, get and push data
   $.each(x, function( i, val ) {
       $.get("http://someurl/"+i, function( data ) {
           a.push(data);
       });
   });

   // Wait till our array is populated?
   while(a.length < x.length){
       console.log(a.length);
   }
   return a;
}

然而,这种方法似乎没有起作用,并且没有任何东西被添加到数组中。 有人能指出我正确的方向吗?

谢谢

3 个答案:

答案 0 :(得分:3)

您正在寻找的解决方案是使用回调

function fetchData(callback) {
    var requests = [];
    for (var i = 1; i <= 10; i++) {
        requests.push($.get("http://someurl/" + i))
    }

    $.when.apply($, requests).then(function () {
        var array = $.map(arguments, function (arg) {
            return arg[0];
        });
        callback(array);
    })
}

fetchData(function (array) {
    //do something with array
})

PoC:Fiddle

答案 1 :(得分:2)

第1期

即使在回调被触发之前,您在结果数组上执行console.log。因此数组a将始终为空。您要做的是在处理数组console.log中的所有值后触发x

第2期

您正在尝试返回结果数组。相反,您应该尝试获取在回调中处理a的代码。

function fetchData(cb){
   x = [1,2,3,4,5,6,7,8,9,10];
   a = [];

   //Loop, get and push data
   $.each(x, function( i, val ) {
       $.get("http://someurl/"+i, function( data ) {
           a.push(data);

           if(a.length == x.length) {
                //looping logic taken inside callback
                while(a.length < x.length){
                   console.log(a.length);

               }
               //calling the callback on result
               cb(a);
           }

       });
   });  

}

fetchData(function(data){

    //process a here

});

答案 2 :(得分:1)

通过这种方式,您无法确保ajax调用将同步完成。为此,您可以进行正常的ajax调用,也可以使用ajaxSetup

通过这些方式,您可以确保在处理完所有调用后读取数组。你也最好有一个超时,因为有些电话可能无法及时返回。