当异步函数等待表达式“暂停”执行时,“暂停”是什么意思?

问题描述 投票:0回答:3

我对 Javascript 中的异步性概念非常陌生,我想确保我没有误解我正在阅读的内容。

在某些 Angular 应用程序中考虑这个伪代码:

async ngOnInit() {

this.responseObject = await this.myService.myGetRequest();

//do some more stuff down here

}

我的理解是 ngOnInit() 将在等待时“暂停”或停止执行,并且在返回承诺对象(数据)之前不会执行该行下面的代码?正确吗?

javascript angular asynchronous promise
3个回答
1
投票

await

 函数中使用的 
async
等待
Promise
值的实现或将变量转换为
Promise

是的,您是正确的,直到使用

await
的上一行返回已完成的
Promise
或该值转换为
Promise
后,下一行的代码才会执行。


注意,目前尚不清楚图案是什么

await this.responseObject = await this.myService.myGetRequest();

预计可以实现。第一个

await
应该可以省略

this.responseObject = await this.myService.myGetRequest();

1
投票

异步函数声明将返回一个 Promise,该 Promise 通过函数调用的返回值进行解析。

如果您添加await表达式,它将停止异步执行并等待您的承诺解决后再继续执行代码中的其他指令,以某种方式使其表现得像“同步”函数。

在这里阅读一些内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function


1
投票

我觉得上面两个答案没有回答核心问题。当 javascript 说正在等待某事时,这是什么意思? JavaScript 是单线程的。因此,它不是处理异步本身,而是在“运行时”(通常是浏览器或节点)提供的单独任务队列中运行所有任务。当我们等待一段代码时,我们将 Promise 放入任务队列中,等待 Promise 完成,然后将其从任务队列中取出以完成代码执行。例如,考虑以下代码块。

function delay(message, timeoutInMilliSeconds) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(message)
      resolve('resolved');
    }, timeoutInMilliSeconds)
  });
}

delay("Finished Outer Timeout", 0)
async function asyncCall() {
  console.log("Before Await")
  delay("Finished Inner Timeout", 2000)
  console.log(`After Await`);
}
asyncCall()

如果await只等待promise结束,我们期望的顺序是

  1. 等待之前
  2. 内部超时完成
  3. 等待后
  4. 外部超时完成

外部超时被放置在任务队列中,主脚本运行直到await,等待内部超时,然后继续直到完成。

实际上的顺序是:

  1. 等待之前
  2. 外部超时完成
  3. 内部超时完成
  4. 等待后

Javascript 不是等待承诺,而是改变主脚本或任务队列之间的控制权。 Await 指示运行时将任务队列负责,而不是简单地等待 Promise 解决。请注意,根据您的浏览器的不同,可能会有所不同,但这通常是 Javascript async/await 的工作原理。

被引用的作品:

© www.soinside.com 2019 - 2024. All rights reserved.