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进来的地方。我的整个理解正确吗?
你的函数不是一个很好的例子,因为返回值与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 次 |
| 最近记录: |