当前位置: 首页 > 知识库问答 >
问题:

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

西门展
2023-03-14

我有一个问题,我无法通过谷歌搜索找到解决方案。

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

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

library.onItemSelectionCallback = function (item) {

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

如何等待我的两个异步任务完成,然后允许这个回调完成?

我唯一能想到的就是每隔大约100毫秒html" target="_blank">循环一次while和sleep,直到这两个promise都得到解决,但这似乎不是一个很好的解决方案。

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

共有2个答案

郑狐若
2023-03-14

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

如果没有黑客,就不可能正确地混合回调和promise。

对于我问题的第二部分——根据@georgeawg的评论,我认为实现HTML5API和回调而不是$http服务和promise的AngularJS模块并不是一个好的AngularJS模块应该如何实现,因此我转向了另一个模块ng文件上传,尽管有人可能会说它不那么时髦,但它做得很好,而且角度也很好(ng file upload提供了一个简单的$upload服务,这是一个promise。如果你想在上传之前修改文件,建议的方法是只需$watch,然后抓住用户拖放或选择文件的瞬间。)。

鲍俊杰
2023-03-14

如果修改项另一个ModifyItem独立工作(也就是说,一个不依赖另一个),您可以将它们都导入$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);
    });
}

这将返回一个与解析的promise。

 类似资料:
  • 问题内容: 这是我要执行的一些代码。我想等待AJAX​​响应,以便可以从服务器返回一些信息。有什么办法可以做到这一点? 问题答案: 很高兴在这里读到。 这实际上不是“同步的”,但我认为它可以达到OP的预期。 旧的(自此之后,jQuery的选项已被弃用): 所有Ajax调用都可以异步(使用回调函数,这是在“成功”键之后指定的函数)或同步完成-有效地阻止并等待服务器应答。要获得同步执行,您必须指定 就

  • 问题内容: 我有一个看起来像这样的代码: 问题是,一旦执行,在关闭弹出的窗口之前,什么都不会发生。 如何继续运行代码? 问题答案: 那是有意的。您要做的是在调用app.exec()之前使用信号/插槽,Qt类中的代码或生成线程。 信号和插槽是您与Qt交互的实际方式。基本上,信号是任何“事件”或自定义“事件”,并且可以将插槽视为“事件处理程序”。例如,当某人按下GUI上的按钮时,它会创建一个信号,以寻

  • 为此,我创建了一个名为的单例。这个类处理所有的输入阅读内容。我创建了一个名为的方法,它将回调作为参数。在这个方法中,我创建了一个新线程,并在其中等待使用的输入。这个类还有方法,它向上面描述的线程发送中断消息。下面是该类的当前实现: 这个代码极不可靠。我一会儿就告诉你我的意思。我制作了一个名为Client的玩具类,在中,我用计时器模拟了消息收入。 以下是它的工作原理: 我知道这个问题非常长(也许是不

  • null 所以我面临一个问题,如果打开,等待输入,如何停止它?我尝试过将它放在线程中并或使用作为标志,但它并没有停止

  • 问题内容: 这是我的代码段。 现在做完之后 我要在这里实现的是,我要等待线程池中的所有线程完成执行,然后关闭执行器。 但是我想这不是这里正在发生的事情。主线程似乎正在执行关闭,它只是关闭了所有内容。 在我的线程池大小为2之前,我做了以下事情,而且似乎可行。 我如何在线程池中使用更多线程?谢谢。 问题答案: 您通常使用以下成语: 只是说执行者不会接受新工作。 等待直到所有已提交的任务完成它们的工作(

  • 问题内容: 遵循方法有效: 4个问题: 1)如果例如不好,我不想执行其余的功能,那我该如何退出(退出,中断,什么,..)? 2)我如何设置其中一些并行,其中一些串行? 3)如何在它们之间传输数据? 4)如何使以下函数从其先前结果中得到依赖? 问题答案: 您在问如何在promise中 链接 功能。 3)如何在它们之间传输数据? 4)如何使以下功能取决于其先前的结果? 返回 链中 下一个函数的数据(或