2016-10-28 88 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