我需要通过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 [...]
我错误地使用$。?有一个更好的方法吗?可能与Angular一起?
答案 0 :(得分:3)
在jQuery的无限智慧中,$.when()
不接受数组作为$.map()
提供的参数。相反,$.when()
需要单独的参数。
因此,您可以使用.apply()
传递$.when()
所需的参数。
$.when.apply($, $.map(...)).then(...)
此外,您还必须在$http.get()
回调中返回$.map()
承诺。所以,改为:
$.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的承诺并使用Angular的$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)
})