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

时间:2016-11-10 18:19:05

标签: javascript angularjs angularjs-resource

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

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

当用户按下保存按钮时,我编写了检测数据块更改的方法,有时控制器会拨打电话,在其他情况下会拨打两到三个。但问题是调用(使用$ resource library)是异步执行的,我希望能更好地控制它。

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

我不知道怎么做,有些伙伴说我可能需要使用$ q AngularJS服务来做这件事,或者存储$ resource必须执行的承诺(我试过这个没有成功或者在JS中使用promises。

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

1 个答案:

答案 0 :(得分:0)

最后我使用$ 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.');
    }
)

感谢您的帮助!