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

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

我在用户配置文件视图中使用 AngularJS 1.5(我真的是 JS 初学者),用户可以在其中更改其数据中的很多内容。

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

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

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

我不知道该怎么做,有些朋友说我可能需要使用 $q AngularJS 服务来做这个,或者存储 $resource 之后必须执行的承诺(我尝试过但没有成功)或在 JS 中使用 promise。

任何人都可以给我任何想法吗?

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

控制器开头

var promises = [];

在我需要在保存用户数据函数内部进行受控调用的所有地方:

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.');
    }
)

感谢您的帮助!