【问题标题】:What is meant by 'pause' when async function await expression 'pauses' execution?当异步函数等待表达式“暂停”执行时,“暂停”是什么意思?
【发布时间】:2018-04-15 09:16:51
【问题描述】:

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

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

async ngOnInit() {

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

//do some more stuff down here

}

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

【问题讨论】:

  • 直到 Promise returned,但直到它 resolved,直到它解析的数据可以分配给属性。
  • 我不明白。 return 仅在我的情况下终止执行,一旦数据可用,get 请求就会得到解决,不是吗?
  • 你了解then 回调(或一般的异步回调)是如何工作的吗?

标签: javascript angular asynchronous promise


【解决方案1】:

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

是的,您是正确的,直到使用await 的上一行返回一个已完成的Promise 或将值转换为Promise 时,才会执行下一行的代码。


注意,不清楚是什么模式

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

有望实现。第一个await应该可以省略

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

【讨论】:

  • 抱歉第一次等待不是故意的。已更正。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我觉得以上两个答案没有回答核心问题。当javascript说它正在等待某事时,它是什么意思? Javascript 是单线程的,并在任务队列中运行所有任务。当我们等待一段代码时,我们将该代码从任务队列中取出,等待 Promise 完成,然后将其放回任务队列以完成代码执行。例如,考虑以下代码块。

    setTimeout(() => console.log("Finished Outer Timeout"), 0);
    async function asyncCall() {
      console.log("Before Await")
      function resolveAfter2Seconds() {
        return new Promise(resolve => {
          setTimeout(() => {
            console.log("Finished Inner Timeout")
            resolve('resolved');
          }, 2000);
        });
      }
      await resolveAfter2Seconds()
      console.log(`After Await`);
    }
    asyncCall()
    

    如果 await 完全阻塞了任务队列,我们​​预计日志记录顺序是:

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

    因为超时必须在任务队列上等待主脚本完成。但是,排序是:

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

    这表示即使主脚本正在等待,任务队列仍然可以运行两个超时函数。请注意,根据您的浏览器可能会有所不同,但这通常是 Javascript async/await 的工作方式。

    被引作品:

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2023-02-03
      • 2010-11-15
      • 2021-09-15
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多