【问题标题】:How does Promise run when .then method is not called?当 .then 方法未被调用时,Promise 是如何运行的?
【发布时间】:2018-12-28 02:21:46
【问题描述】:

我创建了两个 Promise,但我没有对这些 Promise 运行 then 方法。然而,一旦 promise 对象超出范围,promise 代码就会像调用 .then 一样运行。

如果不调用 .then 方法,Promise 如何解决?

我问是因为我想加载一个带有 Promise 对象的数组,然后按顺序运行 Promise。

function promises_createThenRun() {
  const p1 = createPromise1();
  const p2 = createPromise2();

  console.log('before hello');
  alert('hello');
  console.log('after hello');
  // the two promises run at this point.  What makes them run?
}

function createPromise1() {
  let p1 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 1');
      resolve();
    }, 2000);
  });
  return p1;
}

function createPromise2() {
  let p2 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 2');
      resolve();
    }, 1000);
  });
  return p2;
}

【问题讨论】:

  • 为什么你认为setTimeout() 回调不会被调用?
  • 不使用 .then 并不意味着函数不会继续执行。
  • 询问何时调用 setTimeout 回调。当承诺超出范围时,它们似乎会被调用。

标签: javascript promise es6-promise


【解决方案1】:

我想,如果你也不对它们调用 then/catch/finally,“Promise 将不会运行”。但是,如果您考虑这些方法返回新的 Promise,并且根据您的逻辑,您需要在这些返回的 Promise 上调用 then/catch/finally 以“运行”它们,您将陷入无限循环)) )

【讨论】:

    【解决方案2】:

    Promise 构造函数中的代码在创建 Promise 时运行,并且同步运行,这让一些人感到惊讶。所以即使没有then(),一切仍然运行。

    new Promise(resolve => console.log("running"))

    setTimeout 的回调中的代码在被调用之前不会运行,但即使没有 then() 也会运行

    new Promise(resolve => {
      console.log("promise created")
      setTimeout(() => console.log("this runs later"), 1000)
    })

    【讨论】:

    • 但在我的代码中我创建了承诺。然后运行 ​​alert() 来暂停代码。承诺代码在警报之后才会运行。承诺代码在承诺对象被销毁之前不会运行?就像有一个解构器?
    • @StephenRichter - 是的,我知道这会让事情变得混乱。 alert() 暂停计时器,因此即使承诺运行(您可以通过在 setTimeout 之外放置 console.log() 来确认),在您关闭对话框之前计时器不会触发。
    • 附注@StephenRichter 这是一个关于计时器问题的好帖子:stackoverflow.com/questions/26487403/…
    • @10101010 我认为它回答了所提出的问题。如果您不同意,您应该提供答案。
    【解决方案3】:

    调用.then 时,您只需设置一个“回调”,它会说明在承诺完成后应该发生什么。因此,无论是否声明此类回调,都会调用 Promise。

    想象一下调用 AJAX 请求的承诺。调用.then 并向其传递一个函数将使其在ajax 调用完成时运行(成功或失败,如超时或其他错误)。但不调用.then 不会停止运行请求。您根本不会对请求的结果做出反应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多