2012-01-22 2 views
2

я хотел бы написать эту функцию:Функция возвращает список значений, которые могут быть получить только асинхронно

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 асинхронный, это не будет работать. Как я мог сделать это правильно?

+0

Единственная проблема, которую я вижу в вашем коде : results.push [данные]; -> results.push (данные); –

+0

@ItayMoav О, это опечатка, спасибо. как вы думаете, код выше может получить правильный результат? – wong2

+0

Нет; Это не будет работать. – SLaks

ответ

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); 
     }); 
    } 
}  
0

Если вы используете JQuery вы можете установить флаг асинхронной ложь:

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

Можно также сказать, Ajax для запуска синхронно

$.ajax({async: false}); 
var results = getResults(); 
$.ajax({async: true}); 
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

Смежные вопросы