【问题标题】:How do I go about waiting for a promise to resolve in javascript?我该如何去等待在 javascript 中解决的承诺?
【发布时间】:2015-05-07 08:55:37
【问题描述】:

我需要下一行代码中的承诺结果,但我不能只将它包含在承诺的.then 中,因为包含函数完成然后迟到了。

基本上我有一些同步代码和一些异步代码。我需要暂停同步代码并等待异步完成,然后再继续。

function outer () {

  it('1', function () {});
  it('2', function () {});
  it('3', function () {});

  var result = null;
  promise.then(function (r) {
    result = r;
  });

  // How do I wait for result to be
  // valid?

  if (result === true) {
    it('4', function () {});
  }
}

请注意,我可以这样做...

function outer () {

  it('1', function () {});
  it('2', function () {});
  it('3', function () {});

  promise.then(function (result) {
    // It's to late to call it. The outer function is done
    // the it call here causes a throw
    if (result === true) {
      it('4', function () {});
    }
  });
}

【问题讨论】:

  • @FelixKling- 我知道为什么,我知道什么是承诺,我经常使用它,到处都是。我只是想学习如何在一些同步的代码中使用它。
  • 期望一切同步的代码不能调用异步代码。就是这样,这就是另一个问题的重点。
  • @Justin808 - 在这一点上,我认为也许你应该删除这个问题并开始一个新问题,重点关注如何使用具有承诺和异步结果的特定版本的 Jasmine。这将以更好的方式引导您的问题,如果您使用 Jasmine 和 async 对其进行标记,您将有望吸引更多了解该特定问题的人。
  • @jfriend00 - 我试过了。所以改变了我猜,他们不会让我用答案删除它。所以我被一个-2困住了,一个无用的问题是关于SO的。我标记了它以尝试将其删除,我们会看到。

标签: javascript node.js promise


【解决方案1】:

您的限制使这个问题无法回答。它必须进入 then 回调。如果这样做会抛出错误,那是因为您在 sn-p 之外的任何代码也都写错了。

【讨论】:

    【解决方案2】:

    你不能。承诺是异步的。在异步操作完成之前,Javascript 无法“暂停”执行。它只是没有这种能力。因此,您的异步操作不会通过下一行代码传递其结果。您将需要重组代码,以便在知道结果后要运行的所有代码都在 .then() 处理程序中。

    promise.then(function (r) {
        if (r === true) {
            it('4', function () {});
        }
    });
    

    如果您在将代码放入 .then() 处理程序时遇到问题,那么该代码也需要修复,因为这是您可以使用异步结果的唯一地方。因此,根据您的 cmets,这就是您需要做的。您必须学习如何正确使用 Jasmine 与异步结果,以便您可以将代码放入 .then() 处理程序中而不会抛出。

    【讨论】:

    • 太好了,那我该如何去做我需要做的事情呢?正如您所看到的,当我将代码移动到它抛出的 .then() 中时。如果您注意到,我的问题中已经有您的示例代码说我不能这样做。
    • @Justin808 - 你为什么不能把它放在.then() 处理程序中?那是它唯一可以存在的地方,因此您必须在将其放在那里时解释您遇到的问题,然后我们可以帮助您解决该问题。
    • 我得到一个“抛出新错误('jasmine.Suite() required');”。当它在 .then() 中时,它调用的第 4 次发生得很晚。
    • @Justin808 - 那么你需要解决这个问题并理解你为什么会遇到这个问题。我很确定 Jasmine 可以与异步操作一起使用。你将不得不学习如何做到这一点。也许这是一个起点Testing Asynchronous Javascript w/ Jasmine 2.0.0
    • @Justin808:所以,不知何故,您的设置似乎不适用于 Jasmine。您应该提供更多上下文并调查该特定错误。您的一般问题的一般答案是您必须访问 .then 处理程序中的值。
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2018-03-19
    • 2019-04-29
    • 2018-03-13
    • 2018-04-17
    • 2018-04-02
    • 2021-11-26
    相关资源
    最近更新 更多