Функция возвращает список значений, которые могут быть получены только асинхронно - PullRequest
2 голосов
/ 22 января 2012

Я хотел бы написать эту функцию:

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 ]

4 голосов
/ 22 января 2012

Вы также можете указать Ajax работать синхронно

$.ajax({async: false});
var results = getResults();
$.ajax({async: true});
3 голосов
/ 22 января 2012

Вам необходимо вернуть массив с помощью обратного вызова и вызвать обратный вызов при получении последнего ответа. (обратите внимание, что ответы не будут получены в порядке)

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);
        });
    }
}    
0 голосов
/ 22 января 2012
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

0 голосов
/ 22 января 2012

Если вы используете jQuery, вы можете установить флаг асинхронизации в 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 .

jQuery.ajax() Страница API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...