【问题标题】:Why we have to use keyword async and await to making it synchronus in node, when the keyword is literally async?当关键字字面上是异步时,为什么我们必须使用关键字 async 和 await 使其在节点中同步?
【发布时间】:2021-11-21 02:25:28
【问题描述】:

所以我在想ok节点是异步的(意思是多行代码同时执行),那为什么我们使用关键字async(字面意思是异步)来等待关键字await(这使它同步)。为什么没有关键字sync,因为我们正在这样做?有人可以解释关键字异步的逻辑吗?我很困惑。

【问题讨论】:

  • async 关键字使代码同步。 async/await 只是一个使与 Promise 交互的语法更好的工具。它仍在使用 Promise。
  • 节点是异步的(意味着多行代码同时执行)”这不是异步的意思。如果你愿意的话,这个词的字面意思是“不同步”或大致“不连续”(但这也会给人一种错误的印象)。同步代码现在解析每一行,然后移动到下一行。异步代码可以稍后解析一些行。不是“同时”——多线程/并发是一个单独的主题。

标签: javascript node.js typescript asynchronous async-await


【解决方案1】:

async 关键字允许使用await,这只是一种更简化的语法,用于编写带有承诺和异步操作的代码。它不会使任何东西同步。它只是允许您使用与同步代码类似的编程技术,但它仍然是异步的。

谁能解释一下关键字异步的逻辑?我很困惑。

当您使用async 关键字声明一个函数时,您正在创建一个始终返回承诺的不同类型的函数。这仅对异步编程有用 - 因此async 关键字与术语“异步”的关联。

此外,async 关键字不会使任何内容同步。它确实允许您使用更类似于同步的编程模型,该模型更易于使用,特别是对于异步控制流中的条件分支之类的东西,但实际上没有什么异步变为同步的。

作为没有同步的示例,在 sn-p 中运行此示例并注意 console.log() 语句的顺序。 async 函数在遇到第一个 await 时返回,其余的执行将继续,异步操作仍在继续。这是一个带有计时器的模拟,但该计时器可以是任何其他异步操作,例如 http 请求、数据库操作等...

function delay(t) {
    return new Promise(resolve => {
        setTimeout(resolve, t);
    });
}

async function run() {
   console.log("in run() 1");
   await delay(100);
   console.log("in run() 2");
}

console.log("before run()");
run();
console.log("after run()");

您可以从运行这个小示例中看到,只要您点击awaitrun() 函数的执行就会暂停,并在函数调用之后返回允许其他代码运行。然后,稍后某个时间,当计时器触发并且 delay() 承诺被解决时,run() 函数会从它暂停的地方拾取并执行函数体的其余部分。

这在操作上与使用.then() 而不是asyncawait 的代码相同:

function delay(t) {
    return new Promise(resolve => {
        setTimeout(resolve, t);
    });
}

function run() {
   console.log("in run() 1");
   delay(100).then(() => {
       console.log("in run() 2");
   });
}

console.log("before run()");
run();
console.log("after run()");

【讨论】:

    【解决方案2】:

    Node.js 不是“异步”的,相反,Node.js 有一组异步 API。

    回答你关于 async/await - async/await 的问题只是语法糖,因为它在底层使用了 Promise。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2016-11-14
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2015-05-04
      相关资源
      最近更新 更多