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

时间:2015-12-03 05:41:33

标签: javascript angularjs asynchronous angular-promise

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

我有一个图书馆,我正在使用(并且不想编辑,除非它真的有必要)允许用户选择项目,然后调用我的自定义回调功能修改项目,然后继续使用它。

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

library.onItemSelectionCallback = function (item) {

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

在允许此回调完成之前,如何等待我的两个异步任务完成?

我唯一想到的就是循环播放,每隔几百毫秒睡一觉,直到两个承诺都得到解决,但这似乎不是一个很好的解决方案。

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

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

2 个答案:

答案 0 :(得分:3)

如果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解析的承诺。

答案 1 :(得分:1)

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

无法正常混合回调和承诺。

对于我的问题的第二部分 - 根据@georgeawg的评论,认为实现HTML5 API和回调而不是$http服务和承诺的AngularJS模块不是一个好的AngularJS模块应该实现,所以我转向了一个不同的模块ng-file-upload,尽管有人认为它不那么时尚,但是工作得很好并且采用Angular方式(ng-file-upload提供了一个简单的{{} 1}} service,返回一个promise。如果你想在上传之前修改文件,建议的方法是只需$ watch并捕捉用户拖放或选择文件的那一刻。)。