函数返回只能异步获取的值列表

时间:2012-01-22 05:09:38

标签: javascript events asynchronous

我想写这个函数:

function getResults(nums){
    var results = [];
    for(var i = 0, len = nums.length; i < len; i++){
        var num = nums[i];
        ajaxGet("http://xxx.com/" + num, function(data){
            results.push(data);
        });
    }
    return results;
}    
var results = getResults([12, 22, 34]);

正如您所看到的,因为ajaxGet是异步的,所以这不起作用。我怎么能这样做呢?

4 个答案:

答案 0 :(得分:4)

您也可以告诉Ajax同步运行

$.ajax({async: false});
var results = getResults();
$.ajax({async: true});

答案 1 :(得分:3)

您需要使用回调返回数组,并在收到最后一个响应时调用回调。 (请注意,不会按顺序收到回复)

function getResults(nums, callback) {
    var results = [];
    for(var i = 0, len = nums.length; i < len; i++){
        var num = nums[i];
        ajaxGet("http://xxx.com/" + num, function(data){
            results.push(data);
            if (results.length === nums.length)
                callback(results);
        });
    }
}    

答案 2 :(得分:0)

如果您正在使用jQuery,可以将async标志设置为false:

function getResults(nums){
    var results = [];
    for(var i = 0, len = nums.length; i < len; i++){
        var num = nums[i];
        jQuery.ajax({
            url: "http://xxx.com/" + num}, 
            async: flase,
            success: function(data){
                results.push(data);
            }
        });
    }
    return results;
}    
var results = getResults([12, 22, 34]);

但如果你这样做,那么你的方法就错了。改为使用SLaks answer

jQuery.ajax() API page

答案 3 :(得分:0)

var allresults;

function getResults(nums){
    var results = [];
    for(var i = 0, len = nums.length; i < len; i++){
        var num = nums[i];
        ajaxGet("http://xxx.com/" + num, function(data){
            results.push(data);
            if(results.length == nums.length){
                 resume(results);
            }
        });
    }

}

getResults([12, 22, 34]);

function resume(results){
   allresults =  results;
   ....
   ....
}     

像其他人说的那样,如果你没有使用jQuery,请使用