javascript - Angular 服务 foreach $q.promise

标签 javascript angularjs asynchronous promise angular-promise

我有以下功能:

    this.getBenchmarkData = function () {
    var benchmarkData = [];
    var d = $q.defer();
    users.forEach(function(user){
        var dataArray = [];
        modules.forEach(function (module) {
            $http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
                .success(function (response) {
                    response.forEach(function(result){
                        dataArray.push(result.score);
                    })
                });
        });

        benchmarkData.push(dataArray);

    });
    d.resolve(benchmarkData);

    return d.promise
}

问题是 d.resolve(benchmarkData) 在实际数据被放入之前运行。

我知道这是异步 $http 任务的问题。但是我不确定如何修复它。谁能指出我正确的方向?

最佳答案

你没有正确解决 promise ,你应该收集数组中的所有 promise ,然后使用 $q.all 解决延迟的 promise

代码

this.getBenchmarkData = function () {
var benchmarkData = [];
var d = $q.defer(), promise = [];
users.forEach(function(user){
    var dataArray = [];
    modules.forEach(function (module) {
        var currentPromise = $http.get(api.getUrl('teamUserBenchmark', [user.user_id, module.id, user.team_id]))
            .success(function (response) {
                response.forEach(function(result){
                    dataArray.push(result.score);
                })
            });
        promise.push(currentPromise); //<--creating promise array here
    });
});
$q.all(promise).then(function(){ 
   benchmarkData.push(dataArray); //added whole data.
   d.resolve(benchmarkData); //resolved after all promise gets completed
});


return d.promise

关于javascript - Angular 服务 foreach $q.promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29698440/

相关文章:

javascript - Node js mongodb中的增量计数器

node.js - NodeJS 中来自 Dart 的基于 future 的 API

c# - 在 C# 中加速 SOAP 请求

javascript - Node.js:如何防止两个回调同时运行?

javascript - 用于 Web 开发和设计的有用 Vim 插件(php、html、css、javascript)?

javascript - 有没有办法使用查询选择器选择具有一些文本数据的第一个 p 标签

php - 使用div id在JS中传递PHP变量

html - 如何使用 AngularJS ng-include?

javascript - 使用草稿js在react-draft-wysiwyg编辑器中未显示图像

angularjs - 为什么 angular.bootstrap() 到文档会抛出错误