gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:36:29 26 4
gpt4 key购买 nike

可能重复 await is only valid in async function .

我是 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();

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

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

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;
}

问题 1: 在这里,我不明白将 async 设置为使用 await 的义务。只放置 async 只会让函数返回一个 Promise 而不是一个值。流量不变。它仍然在打印 7 之前打印所有数字。

问题 2: 我认为函数前的 async 一词会误导人们认为函数调用将是异步的,尽管事实并非如此。关于设计的任何澄清?

问题 3:

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

我的整个理解是否正确?

最佳答案

您的函数不是一个很好的例子,因为返回值与 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;
}

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

async 向 JavaScript 引擎发出信号,表明该函数将以这种特殊方式执行,同时向人类代码阅读者发出信号,表明它返回一个 Promise,而不是返回值(除非返回值本来就是一个 promise,不需要包装)。

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

关于javascript - Nodejs 为什么 await 只限于异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53475814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com