如何在angular.js中处理多个异步任务?

 空灵一_一_379 发布于 2023-02-13 11:46

在沙盒应用程序上工作以学习angular.js我在代码中的几个地方遇到了以下模式.我发现自己不得不在循环中查询mongoDB.据我了解,每次调用都发生在自己的异步任务中.我如何知道所有任务何时完成?

例如,我有一系列状态.通常我需要为每个状态将someProperty设置为someNewValue.一旦所有状态都已更新,我想调用someFunction().

for (var i = 0; i < $scope.states.length; i++) {
    $scope.states[i].someProperty = someNewValue;
    $scope.states[i].$update({stateId: $scope.states[i].id}, function() {
        someFunction();
    });
}

现在,我能想到这样做的唯一方法是每次更新成功时调用someFunction().我知道必须有一个更聪明,更好的方法.

你的方法是什么?

1 个回答
  • 承诺和$q.all(参考)是你的朋友.

    更详细地说,您必须为每个调用做出承诺(如果调用本身没有返回),将它们推入数组并调用$q.all(promises).then(allFinished).天真的情况,哪里$update()没有回复承诺:

    function callUpdate(x, promises) {
        var d = $q.defer();
        x.$update({stateId: $scope.states[i].id}, function() {
            someFunction();
            d.resolve(); // it may be appropriate to call resolve() before someFunction() depending on your case
        });
        promises.push(d.promise);
    }
    
    ...
    
    var promises = [];
    for (var i = 0; i < $scope.states.length; i++) {
        $scope.states[i].someProperty = someNewValue;
        callUpdate($scope.states[i], promises);
    }
    
    $q.all(promises).then(function() {
        // called when all promises have been resolved successully
    });
    

    存在的原因callUpdate()是封装延迟对象处理并返回promise.

    2023-02-13 11:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有