【问题标题】:How to handle multiple async tasks in angular.js?如何在 angular.js 中处理多个异步任务?
【发布时间】:2021-11-19 15:10:05
【问题描述】:

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

例如,我有一个 states 数组。通常我需要为每个状态将 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();
    });
}

目前,我能想到的唯一方法是在每次 update 成功时调用 someFunction()。我知道必须有一种更聪明、更好的方法来做到这一点。

你的方法是什么?

【问题讨论】:

标签: javascript mongodb angularjs asynchronous callback


【解决方案1】:

Promises 和 $q.all (ref) 是你的朋友。

更详细地说,您必须为每个调用做出一个承诺(如果调用本身没有返回一个),将它们推送到一个数组中并调用$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。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2015-11-23
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多