2016-10-28 87 views
0

我需要通過AJAX獲取數組中每個文件的內容,分析它們,然後將結果放入數組中。但是,JS似乎跳過了我的AJAX調用。我試圖使用jQuery的when使其等待,但它似乎並不奏效:

$.when(
    // Send a request for each file 
    $.map(fileNameArray, function(fileName,i){ 
     $http.get(path + fileName).then(function(file) { 
      // analyze the results (takes some time) 
      var analysis = analyze(file) 
      $log.log("analysis: " + analysis) 
      return analysis 
     }) 
    }) 
).then(function(x){ 
    // I want this to run only after $.map is finished 
    $log.log("x: " + x) 
}) 

我得到這樣的結果:

x: 
analysis: > Object... 

不過,我期待看到這個:

analysis: Object... 
x: Array [...] 

我是否使用$ .when不正確?有一個更好的方法嗎?可能與Angular?

回答

3

在jQuery的無限智慧中,$.when()不接受數組作爲參數,它是$.map()提供的參數。相反,$.when()需要單獨的參數。

因此,您可以使用.apply()來傳遞參數,如$.when()所要求的那樣。

$.when.apply($, $.map(...)).then(...) 

此外,您還必須從$.map()回調中返回$http.get()承諾。所以,改成這樣:

$.when.apply($, 
    // Send a request for each file 
    $.map(fileNameArray, function (fileName, i) { 
     return $http.get(path + fileName).then(function (file) { 
      // analyze the results (takes some time) 
      var analysis = analyze(file); 
      $log.log("analysis: " + analysis) 
      return analysis; 
     }); 
    }); 
).then(function(arg1, arg2, arg3) { 
    // results are in separate arguments here 
}); 

更妙的是刪除了jQuery從這個承諾完全和使用角度的$q.all()

$q.all(fileNameArray.map(function(fileName, i) { 
    return $http.get(path + fileName).then(function(file) { 
     // analyze the results (takes some time) 
     var analysis = analyze(file); 
     $log.log("analysis: " + analysis) 
     return analysis; 
    }); 
})).then(function(results){ 
    // array of results here 
    $log.log(results) 
}) 
+0

是角度和JQuery的承諾兼容嗎?,我會更好地使用$ q.all –

+0

@ bto.rdz - 好點。我建議從它中刪除所有的jQuery。如果稍後會添加這樣的版本。 – jfriend00