我有两个服务调用,我想按顺序同步执行。但即使我使用promises也没有发生。
控制器:
vm.nominationSVC.zipping(vm.fileSelected, vm.selectedCategoryId).
then(function (response: any) { //Zipping
vm.nominationSVC.downloadDocument("documents.zip");
}).
then(function (response: any) {
var deffered = vm.$q.defer();
for (i = 0; i < vm.rowSelectedLength; i++) {
vm.objDownloadHistory.Nomination_Id = vm.nominationIdSelected[i];
vm.objDownloadHistory.FilePath = vm.fileNamesSelected[i];
vm.promises.push(vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory));
}
// vm.$q.all(vm.promises).then(function () {
// console.log("sdsd");
// });
}).
then(function (response: any) {
vm.getNomiantionList();
});
方法vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory)没有完全执行,而是归结为其他.then方法,即vm.getNomiantionList();
我也尝试使用$ q.all,如评论代码中所述。但我仍然无法解决此问题。
服务方式:
updateDownloadHistory(objDownloadHistory: SpotAward.DownloadHistory)
{
var vm = this;
var url: any;
var deferred = this.$q.defer();
url = this.BaseUrl + 'DownloadHistory/UpdateDownload';
if (url !== null) {
this.$http.post(
url,
JSON.stringify(objDownloadHistory),
{
headers: {
'Content-Type': 'application/json'
}
}
).then(function (result: any) {
if (result.data > 0)
deferred.resolve(result.data);
}).catch((data) => {
deferred.reject(data);
});
}
return deferred.promise;
}
答案 0 :(得分:0)
根据您的代码,预期的行为应该是: - 执行vm.nominationSVC.zipping - 当解析vm.nominationSVC.zipping返回的promise时,then()后面的三个将被称为顺序。那不是一个好习惯。
每个promise只应使用一次then()调用,这样可以直观地显示回调链。尝试类似:
vm.nominationSVC.zipping(vm.fileSelected, vm.selectedCategoryId).
then(function (response: any) { //Zipping
vm.nominationSVC.downloadDocument("documents.zip");
var deffered = vm.$q.defer();
var promises = [];
for (i = 0; i < vm.rowSelectedLength; i++) {
vm.objDownloadHistory.Nomination_Id =vm.nominationIdSelected[i];
vm.objDownloadHistory.FilePath = vm.fileNamesSelected[i];
promises.push(vm.nominationSVC.updateDownloadHistory(vm.objDownloadHistory));
}
$q.all(promises).then(function () {
vm.getNomiantionList();
});
});
在这种情况下,将依次调用3个旧的then()调用(我假设vm.nominationSVC.downloadDocument是同步的并且不返回一个promise)。
我希望它会有所帮助