Nodejs 为什么 await 只限于异步函数?

Sha*_*wat 7 javascript asynchronous node.js async-await

await 的可能重复 仅在 async 函数中有效

我是新手NodeJS,我发现这个概念async-await有点混乱。经过一些阅读和混乱之后,这就是我的理解。

假设,我有一个sum这样的功能。

function sum(a, b) {
  // print the numbers
  for (var i = 0; i < 100000; i++) {
    console.log(i);
  }
  // settimeout
  new Promise (resolve => {
    setTimeout(resolve, 1000);
  });
  return a+b;
}

function main() {
  let a = sum(5,2);
  console.log(a);
}

main();
Run Code Online (Sandbox Code Playgroud)

它为计时器分配一个新线程并继续正常流程。它首先打印所有数字,返回a 7,然后在退出前等待1 秒。

但是现在我想按照它们的写入顺序执行这些行。await在 timer 之前放置一个关键字是有意义的Promise

async function sum(a, b) {
  // print the numbers
  for (var i = 0; i < 100000; i++) {
    console.log(i);
  }
  // settimeout
  await new Promise (resolve => {
    setTimeout(resolve, 1000);
  });
  return a+b;
}
Run Code Online (Sandbox Code Playgroud)

问题 1:在这里,我不明白 put asyncto use的义务await。只有 putasync只会让函数返回一个Promise而不是一个值。流量不变。它仍然在打印前打印所有数字7

问题 2:我认为async函数前面的词会误导人们认为函数调用是异步的,尽管它们不是。关于设计的任何澄清?

问题 3:

  • 在 中NodeJS,没有同步或异步函数调用的概念,除非我们有一些阻塞函数,如定时器、远程请求和 IO 操作。这就是概念async-await出现的地方。否则,即使程序有Promises.
  • async除了函数只是使它返回Promise,而不是一个值。它不会改变程序流程。也许,它只是增加了一些额外的机器来处理await(如果有的话)只是一个猜测!!.
  • async不一定使任何函数(或其调用)异步。调用具有async关键字的函数仍然是同步的,除非它包含另一个Promise让它等待的函数。这就是await进来的地方。

我的整个理解正确吗?

Ama*_*dan 5

你的函数不是一个很好的例子,因为返回值与await结果没有任何联系。因此,使用Promise是无关紧要的,因为没有它可以重写代码。让我们稍微改变一下你的函数,让它在 Promise 中实际生成结果:

function sumLater(a, b) {
  return new Promise(resolve => {
    setTimeout(() => resolve(a+b), 1000);
  });
}

async function sum(a, b) {
  // print the numbers
  for (let i = 0; i < 100000; i++) {
    console.log(i);
  }
  // settimeout
  let result = await sumLater(a, b);
  // using the awaited result
  console.log("The awaited result is", result);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

async显着改变了函数在内部执行的方式。一方面,任何使用 Promise 的函数都不能返回在 Promise 内部生成的值。以同样的方式,任何包含的函数都await不能返回从await以后生成的任何内容,而无需将其包装在 Promise 中。其原因是当前计算架构中缺乏时间旅行。如果一个函数现在可以返回一个将在两小时完成的操作的结果,那将是一个相当令人印象深刻的突破。

async向 JavaScript 引擎发出一个信号,即函数将以这种特殊方式执行,也向人类代码阅读器发出它返回 Promise 而不是返回值的信号(除非返回值一开始就已经是一个 Promise ,并且不需要包装)。

您的大多数问题都是由于术语混淆造成的。不要纠结于术语的字面意思。JavaScript 中没有任何东西(Web Workers 除外)是同时发生的,乍一看同时和同步应该是同义词。在 JavaScript 中,同步意味着“完全在同一个任务中执行”,而异步意味着“导致一个新任务被放置在执行堆栈上”,或多或少,就我所见。从这个角度来看,async 确实意味着该函数将是异步的,因为在 JavaScript 中“异步”的含义。


归档时间:

查看次数:

1769 次

最近记录:

4 年,8 月 前