$。在完成之前没有完成

时间:2016-10-28 17:17:07

标签: jquery angularjs

我需要通过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一起?

1 个答案:

答案 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)
})