javascript - 我有一个关于 js Async Await 行为结构的问题

标签 javascript asynchronous async-await

function delay(count) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(1000);
    }, count);
  });
}
async function method1() {
  let val = 0;
  console.log("one");
  val = delay(3000);
  console.log("two")
  return val;
}
method1().then(function(result) {
  console.log(result);
});

以上是我的示例代码。
首先,我没有使用 await delay(),这就是我的意图。
首先,上述代码的预期编写流程如下:

  1. console.log("one")
  2. console.log("两个")
  3. 返回值;
  4. console.log(结果)
  5. 解决(1000);

但现实却有所不同。实际执行结果如下 如下。

  1. console.log("one")
  2. console.log("两个")
  3. 解决(1000)
  4. 返回值;
  5. console.log(结果)

我期望首先执行return val的原因是因为 这是因为我们相信其余的代码将是 当 delay() 函数以异步方式进行时执行 沟通。 但是,实际上,return 直到 delay() 被执行后才被执行。 完成了。

如果我使用awaitdelay(),则在delay()处暂停。 setTimeout 退出后,console.log("two") 被执行,我完全理解这个概念。
但是,如果不使用await,则执行其余代码,但是 为什么要等到delay()完成后才执行return?

最佳答案

This is because we believed that the rest of the code would be executed while the delay() function proceeded

您的代码与此等效。您正在向 val 分配一个 promise 。由于 val 是一个 Promise,因此您可以使用 then,并且在 3000 毫秒后解析时,它会记录 then< 内的值

async function method1() {
  let val = 0;
  console.log("one");
  val = new Promise(function(resolve) {
    setTimeout(function() {
      resolve(1000);
    }, 3000);
  });
  console.log("two")
  return val;
}
method1().then(function(result) {
  console.log('**', result);
});

来自评论

As far as I know a promise is simply a piece of code that runs when a certain action completes.

Promise 被急切地加载。在执行程序完成之前,构造函数不会返回。当执行器获得结果时,它会调用函数resolvereject之一。因此,它不是在某个操作完成时运行的一段代码

在下面的示例中,您可以看到 Promise 在分配给变量后立即执行

async function method1() {
  let val = 0;
  console.log("one");
  val = new Promise(function(resolve) {
    setTimeout(function() {
      console.log('Inside Promise')
      resolve(1000);
    }, 3000);
  });
  console.log("two")
  return val;
}
method1()

关于javascript - 我有一个关于 js Async Await 行为结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68519231/

相关文章:

javascript - 使用 jquery 重新解析 html 页面/部分,使用 Ajax 更新某些部分

javascript - 异步回调不可能嵌套

javascript - 重定向到另一个页面会阻止函数返回它们的值

xamarin - 如何在 DelegateCommand 中使用异步方法

c# - 如何使用 Task.WhenAny 并实现重试

mysql - 如何让提交等到 if 语句运行完毕?

javascript - AJAX 在 node.js 中可用吗?为什么

javascript - JavaScript中如何调用类函数?

javascript - Angular ng-click 不会触发我指令中的函数

c# - 为什么阻塞线程比异步/等待消耗更多?