【问题标题】:Async and await in javascript [duplicate]javascript中的异步和等待[重复]
【发布时间】:2021-01-16 10:28:25
【问题描述】:

我是JS 的初学者,在经历asyncawait 时,我遇到了以下示例:

const get = async () => {
    const y = await "hello";
    console.log(y);
}

console.log("start");
get();
console.log("end");

O/P

start
end 
hello

但是根据我的理解await 会阻止当前程序的执行,直到promise 可用,那么为什么在上面的示例中没有发生呢?是我的理解不正确还是缺少其他概念?

【问题讨论】:

  • “据我所知await 阻止了当前程序的执行”。这是棘手的部分。它不会阻止程序。它仅阻止周围功能。 get() 仍然是异步的,它周围的其余程序仍然可以运行

标签: javascript ecmascript-6 promise


【解决方案1】:

async 函数遇到函数中的第一个 await 时,它会立即暂停该函数的进一步执行,然后立即从该函数返回一个 Promise。调用者收到该承诺并继续执行。因此,当前函数被挂起,而不是调用者或 JS 引擎的其余部分。

所以,在你的代码中:

const get=async ()=>{
    const y=await "hello"
    console.log(y)
}

console.log("start")
get()
console.log("end")

这是事件的顺序:

  1. 日志“开始”
  2. 开始执行get()
  3. 获取第一个await
  4. 暂停get() 函数的进一步执行
  5. get()返回承诺
  6. 调用代码继续执行并记录“结束”
  7. 当调用代码返回事件循环时,await 结束,因为没有实际的承诺等待,get() 函数继续执行并记录“hello”

所以,await 只暂停当前函数的执行,导致它立即返回一个承诺,然后调用代码继续执行。稍后,当您正在等待的语句解析(通常是一个承诺)并且解释器返回到事件循环时,该函数将继续执行直到下一个 await 或直到它达到其返回值,然后变为它最初返回的承诺的已解决值,并且该承诺已解决(您的代码忽略了该值)。

注意,await 通常应与承诺一起使用,而不是与常量一起使用。虽然它不会导致await 出现错误,但它不会做任何有用的事情。

【讨论】:

    【解决方案2】:

    await 没有阻塞程序的执行,它推迟将当前执行的async 方法的continuation交给一个微任务并继续执行async 方法调用者。

    当您await 不是 Promise(字符串、数字或其他任何内容)时,它将自动包装在 Promise 中,并且将等待该承诺。

    所以是的,一切都按您的代码示例中的预期工作。

    【讨论】:

      【解决方案3】:

      首先 async/await 与 Promise https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 一起工作

      不是字符串。

      如果您希望您的代码正常工作,这里有一个示例 =)

      const helloPromise = new Promise((resolve) => resolve('hello'));
      
      const get = async () => {
        const y = await helloPromise;
        console.log(y);
      }
      
      const main = async () => {
        console.log("start");
        await get();
        console.log("end");
      }
      
      main();

      【讨论】:

      • await "string" 没有任何问题。这是明确允许的,尤其是对于这个例子。这当然不是解释。
      • @SebastianSimon 这只是一个例子,和 mdn 上的差不多,你不应该这样写。只是重写了他的代码以按照他的意愿工作。
      • 这个问题是问为什么输出是startend,然后是hello。它不是在问如何“解决”这个问题;)
      • @NickParsons 我明白,完全是我的错,当然应该投反对票,抱歉 =)
      猜你喜欢
      • 2016-12-06
      • 2018-03-22
      • 1970-01-01
      • 2018-04-17
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2018-09-02
      相关资源
      最近更新 更多