angularJS $ q - 停止执行以等待所有承诺

问题描述:

我遇到了这个问题,我无法通过Google搜索找到解决方案。

我有一个库,我正在使用(并且不想编辑,除非真的有必要),它允许用户选择一个项目,然后调用我的自定义回调函数来修改该项目,然后继续与它合作。

我需要对其执行一些异步任务,这可能需要一些时间。这会创建竞争条件,因为当回调函数完成时,我的异步任务尚未完成,并且库继续处理项目。

library.onItemSelectionCallback = function (item) { 

    myService.modifyItem(item).then(
     function (modifiedItemProperty) { 
      item.newProperty = modifiedItemProperty; 
     }); 
    myService.anotherModifyItem(item).then(
     function (modifiedItemProperty) { 
      item.existingProperty = modifiedItemProperty; 
     }); 
} 

如何等待我的两个异步任务完成,让这个回调结束之前?

我能想到的唯一事情就是循环着,每隔几百毫秒睡一会儿,直到两个承诺都已解决,但这似乎不是一个很好的解决方案。

据我所知,这使得异步请求非常同步,并可能对用户体验不利,但实际上并没有看到另一种出路。

编辑:我知道,我和消除问题的一般性质,从而使它过于本地化,我会说,我试图用angular-file-upload模块,特别是冒着,试图安装一个定制imageService,这会在上传之前调整图片的大小。我正在将它挂在onBeforeUploadItem回调上。这个想法是,创建调整大小的图像可能需要一段时间,这就是为什么我需要从我的imageService返回承诺,这需要在上传之前解决。

+0

不,如果该库无法处理异步选择回调,则需要对其进行编辑(或向上游发送功能请求)。这是没有办法的。甚至不要尝试像忙碌的等待。 – Bergi

+1

我发现不幸的是,[angular-file-upload](https://github.com/nervgh/angular-file-upload)模块的作者选择使用原生HTML 5上传,而不是使用AngularJS'$ http'服务。我建议您避免使用该模块及其API。 – georgeawg

对于我的问题的第一部分 - 是的,我想真正等待这两个承诺解决的唯一方法是使用whilesleep,使它们同步,这可能会工作,甚至不会那是不好的(除非网站在请求被满足之前暂停),但是会让我感到自己作为一个人以及我的行为如何影响这个世界非常非常糟糕。

不可能正确地混合回调和承诺,而无需hacks afaik。

对于我的问题的第二部分 - 按@georgeawg的意见,想通实现HTML5 API和回调,而不是$http服务和承诺的AngularJS模块是一个很好的AngularJS模块不应该怎么实现,所以我转向了一个不同的模块ng-file-upload,尽管人们可能会说它不那么时尚,但它能够很好地以角度的方式完成这项工作(ng-file-upload提供了一个简单的$upload服务,它返回一个承诺。如果你想在上传之前修改文件,建议的方法是只需$ watch并捕获用户拖放或选择文件的时刻。)。

如果modifyItemanotherModifyItem独立工作(即,一个不依赖于其他的),你可以管他们两个到$q.all,如

library.onItemSelectionCallback = function(item) { 
    var promises = { 
     newProperty: myService.modifyItem(item), 
     existingProperty: myService.anotherModifyItem(item) 
    }; 

    return $q.all(promises).then(function(values) { 
     return angular.extend(item, values); 
    }); 
} 

这将返回所有以item解决的承诺。

+0

会这样吗? 'onItemSelectionCallback'函数将设置一个承诺,只有当两个基础承诺都已解决时才解析,将附加的onSuccess(带有angular.extend的函数)附加到此解析上,并返回一个承诺,只有在onSuccess '功能已经完成。但它仍然是'onItemSelectionCallback'函数返回的承诺。图书馆没有什么能够等待这个承诺的解决。该库只是执行'onItemSelectionCallback'函数,并在控制权恢复后继续工作。 – Reinis

+0

@georgeawg:其实,根据它的文档。当... – Bergi

+0

@ user3104219:那么你的运气不好。 – Bergi