我在用户配置文件视图中使用AngularJS 1.5(我真的是初学者),用户可以在其中更改数据中的大量内容。
在此视图中,数据分为几个部分,保存所有这些数据意味着要对服务器进行多次调用(由于应用程序的设计)。所以我发现的问题是当用户修改他的数据时可能只修改了一部分,当它按下保存按钮时我不想调用所有方法,只需要必要的方法。
当用户按下保存按钮时,我编写了检测数据块更改的方法,有时控制器会拨打电话,在其他情况下会拨打两到三个。但问题是调用(使用$ resource library)是异步执行的,我希望能更好地控制它。
我想要做下一个:将所有调用存储在列表或数组中,但不执行它们并在同时执行all(或多或少)之后。如果其中任何一个失败,我想向用户显示一条错误消息(只是一般错误消息),但在内部记录失败的呼叫,同样只在所有呼叫结束时显示(且只有一个)成功消息成功(而不是每次成功通话的消息)。
我不知道怎么做,有些伙伴说我可能需要使用$ q AngularJS服务来做这件事,或者存储$ resource必须执行的承诺(我试过这个没有成功或者在JS中使用promises。
任何人都可以给我任何想法吗?
答案 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.');
}
)
感谢您的帮助!