如何将AngularJS的$resource调用存储在一个数组中,然后一起执行

How store AngularJS $resource calls in an array to execute all together after?

本文关键字:数组 一个 执行 一起 然后 AngularJS resource 存储 调用      更新时间:2023-09-26

我正在使用AngularJS 1.5(我是JS的初学者)在用户配置文件视图中工作,用户可以在他的数据中更改很多东西。

在这个视图中,数据被分成几个部分,保存所有这些数据意味着对服务器进行多次调用(由于应用程序的设计)。我发现的问题是当用户修改数据时可能只修改其中的一部分当它按下保存按钮时我不想调用所有的方法,只调用必要的方法

我已经编写了一种方法,当用户按下保存按钮时检测数据块中的变化,有时控制器进行调用,在其他情况下进行两次或三个调用。但问题是调用(使用$resource library)是异步执行的,我希望可以更好地控制这一点。

我想做下一个:将所有调用存储在列表或数组中,但不执行它们,然后同时执行所有调用(或多或少)。如果这些都失败了,我想向用户显示一个错误消息(只是一个通用的错误消息),但在内部记录失败的调用,并以同样的方式只显示(而且只有一个)成功消息,当所有调用都以成功结束时(而不是每个成功调用的消息)。

我不知道如何做到这一点,一些朋友告诉我,也许我需要使用$q AngularJS服务来做到这一点,或者存储$resource必须执行的所有承诺(我尝试过没有成功)或在JS中使用承诺。

谁能给我点主意?

最后我用$q解决了这个问题。起初我想存储调用而不执行它们(我认为这样更好),但最后我可以检查仅存储此调用的结果是否足以满足我的目标。所以,这是我已经完成的解决方案的框架:

控制器开头

var promises = [];

在所有需要在save user data函数内进行受控调用的地方:

var deferred = $q.defer();
var promise = vm.teacher.$update(
    function () { // Success
        deferred.resolve('Success updating the teacher.');
    },
    function (error) { // Fail
        deferred.reject('Error updating the teacher, error: ' + error)
    });
promises.push(deferred.promise)
}
...
... vm.otherItems.$update ... 
...

在这个函数的末尾,像这样:

$q.all(promises).then(
    function(value){
        console.log('Resolving all promises, SUCCESS,  value: ')
        console.log(value);
        toastService.showToast('Success updating the teacher.');
        // It deleted old promises for next iteration (if it exists)                
        promises = [];
    },function(reason){
        console.log('Resolving all promises, FAIL, reason: ')
        console.log(reason);
        toastService.showToast('Fail updating the teacher.');
    }
)

谢谢你的帮助!