2012-01-22 39 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 [data]; - > results.push(data); –

+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可以異步標誌設置爲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

你也可以告訴阿賈克斯運行同步

$.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