【问题标题】:If I use async/await, it doesn't run in order如果我使用 async/await,它不会按顺序运行
【发布时间】:2022-01-25 23:18:52
【问题描述】:

我有一个关于异步/等待执行的问题。

示例代码

async firstMethod(){
  new Promise((resolve, reject)) => {
     setTimeout(() => {
        resolve("test1");
     }, 3000);     
  });
}

async secondMethod() {
  new Promise((resolve, reject)) => {
     setTimeout(() => {
        resolve("test2");
     }, 1000);     
  });
}

await firstMethod();
await secondMethod();

所以,当执行这两个方法时,会得到如下结果。

test2
test1

但是,如果附加了return,结果值如下。

async firstMethod(){
  return new Promise((resolve, reject)) => {
     setTimeout(() => {
        resolve("test1");
     }, 3000);     
  });
}

async secondMethod() {
  return new Promise((resolve, reject)) => {
     setTimeout(() => {
        resolve("test2");
     }, 1000);     
  });
}

await firstMethod();
await secondMethod();
test1
test2

这是为什么呢?如果您能解释一下,我将不胜感激。

【问题讨论】:

  • 因为没有返回,你的方法不会返回等待的承诺。他们返回一个未定义的承诺,与new Promises 无关。
  • 我反对这种行为(await on non-promises automatically Promise.resolveing)并输了。
  • 帖子显示了两组结果。您可以编辑帖子以显示它们的制作地点和方式吗?

标签: javascript node.js async-await promise


【解决方案1】:

在第一种情况下,您只需等待外部 Promise(即 firstMethodsecondMethod 函数)和由 new Promise 创建的内部 Promise 不会被等待,而只是在后台运行完成。

在第二种情况下,由于 promise unwrapping 您等待返回的内部 promise together 与外部函数 promise。

【讨论】:

    【解决方案2】:

    在第一个示例中,这两个函数没有按顺序运行的原因是因为您没有等待任何东西。如果您尝试从第一个示例中的函数定义中删除async,您将得到相同的结果,因为该函数不需要async,因为它不需要await。在第二个示例中,您可以做的是在new Promise 之前添加await

    注意:在第二个示例中,您也不需要 async,因为您没有等待任何内容,您只是返回了一个 Promise,您在范围外等待。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 2020-08-16
      • 2022-08-14
      • 2019-09-14
      • 2020-11-05
      • 1970-01-01
      • 2021-05-12
      • 2017-09-11
      相关资源
      最近更新 更多