【问题标题】:How to build synchronous code containing a promise如何构建包含承诺的同步代码
【发布时间】:2014-08-27 00:54:34
【问题描述】:

我有这个功能:

var send = function send (report) {
        someAsnycFn().then(
            function () {
                synchronousSend(report);
                return true;

            }, function () {
                throw new Error("The user is not authenticated! Not sending report");
            });
    };

我的目标是让 send 函数阻止代码执行,直到 promise 得到解决,然后执行相应的代码块并继续执行代码。

我猜例如在 C# 中你会为此使用 await...

我如何在 JS 中做到这一点?

谢谢大家。

【问题讨论】:

  • 你的send函数应该return一个承诺!
  • 为什么?我不想更改我的代码以满足我的测试框架。
  • 这不是为了满足一个测试框架,而是为了你的应用程序的功能。如果您拒绝未返回的承诺,则没有人能够处理拒绝 - 无法捕获 throw(无论是在您的测试中,还是在您的实际代码中)。
  • 必须返回promise,除非你想阻塞整个进程>一切都用回调处理,只有一个线程运行JavaScript本身,这就是本质语言。如果你想在send完成时执行代码,让它返回promise,然后使用send的人就可以使用promise。
  • @Sentenza: "现在我想要同步发送" - 那是不可能的。你真的不想让代码阻塞。 Promise 不是在同步和异步之间切换的工具,它们是使异步回调更加可组合和可维护的工具。

标签: angularjs promise q


【解决方案1】:

经过进一步研究,我实际上找到了解决这个问题的两种方法:

  1. 使用 Providers 和 yieldgalaxy-lib 将它们包装起来,以便像 asnyc/await 一样使用它们。
  2. ECMAscript 7 defines async/await-Syntax。这样我就可以做到:

    asnyc function send (report) {
        await someAsyncFn().catch(throw new Error("The user is not authenticated! Not sending report"));
        synchronousSend(report);
        return true;
    }
    

问题是,我仍在使用 ECMAscript 5,因此我无法使用它(在生产环境中)。我的临时解决方案是将send 实际转换为返回承诺的异步函数。

【讨论】:

  • 最好把 send 变成一个异步函数,你最终还是需要这样做。
  • 查看 facebook 的再生器。
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2020-07-04
  • 2017-02-06
  • 2019-02-23
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多