【发布时间】:2023-02-05 20:49:27
【问题描述】:
我正在努力提高我对异步 JavaScript 的理解。为此,我制作了一个可能需要很长时间才能完成的函数,这将完全阻止任何其他代码的执行。
为了测试这一点,函数计数。第一次调用从 1 到 10000000。第二次调用从 10 到 100。
代码
async function LongTask(from, to) {
//Count up
let myNum = from
console.log(`counting from ${myNum} to ${to}`)
while (myNum != to) {
//console.log(`myNum: ${myNum}`);
await myNum++;
}
console.log(`counting from ${from} to ${to} done!`);
}
//2 functions that take some time to finish
LongTask(1, 10000000);
LongTask(10, 100);
//Do unrelated stuff
console.log("Hello World!");
输出
counting from 1 to 10000000
counting from 10 to 100
Hello World!
counting from 10 to 100 done!
counting from 1 to 10000000 done!
我设法得到它,因为它更快,所以 10 到 100 将首先完成。但是,我在第 10 行 await myNum++; 收到一条警告说'await' 对此表达式的类型没有影响。删除 await 关键字会导致代码阻塞,因此函数的第 10 到 100 次调用将不得不等待更长的时间,不相关的 1 到 10000000 次调用在被调用之前完成。
我是否误解了异步 JavaScript 的工作原理,是否有更好的方法来确保 10 到 100 的调用首先完成?
【问题讨论】:
-
await仅在与 Promises 一起使用时才有意义。你真的不能等待其他任何东西,它只会产生价值并继续。 -
认为您可以使用带有异步等待的 Promise.all 执行多个异步等待,试试吧
-
计数对于这种类型的插图不是很好,因为它们基本上都是瞬时的。使用 sleep function 以确保一个花费的时间比另一个长。 jsfiddle
标签: javascript asynchronous async-await