JavaScript是单线程语言,这意味着所有用户编写的代码都将在主线程中运行。例如,在Node.js中,异步IO读取是一个异步操作,它在工作线程中运行,但是开发人员编写的回调与其他JS代码一样在主线程中运行。因此,如果我用 async 标识了一个JS函数,它实际上并没有在其他线程中运行,更重要的是, async 也不意味着是非阻塞的。
const sleep = (wait) => {
const start = new Date().getTime();
while (new Date().getTime() - start <= wait) {}
}
const async_print1 = async () => {
setTimeout(() => {
sleep(2000);
console.log('async_print1'); /// in 4s.
}, 2000);
}
const async_print2 = async () => {
setTimeout(() => {
sleep(1000);
console.log('async_print2'); /// in 5s.
}, 2000);
}
const sync_print = () => {
sleep(1000);
console.log('sync_print'); /// in 1s.
}
async_print1();
async_print2();
sync_print();
输出:
[00:00] <program start>
[00:01] sync_print
[00:04] async_print1
[00:05] async_print2
[00:05] <over>
Fisrt,sync_print
在主线程中运行,它休眠1秒然后打印。然后,两个计时器启动,在2秒后,运行循环需要调用两个回调,这两个回调都在主线程中运行,因此它们阻塞了操作。
我的问题是如何使两个sleep()
在其他线程中运行?还是不能?
**更新了我的问题**
对不起,我的英语能力和表达能力不好,我终于明白了。谢谢。 Is it possible to execute Javascript functions with multi-threads
答案 0 :(得分:3)
无法将同步代码转换为异步代码。如果事件循环正忙于运行while循环(正在阻塞代码),则它将太忙以致无法执行其他任何操作。 async
关键字只是使函数返回一个承诺(并允许您在其中使用await
)。
您可以使用Web Workers将代码分流到另一个线程中。
答案 1 :(得分:1)
您可能还不需要网络工作者。好像您完全忘记了await
-
const sleep = ms =>
new Promise (r => setTimeout (r, ms))
const asyncPrint1 = async () =>
{ await sleep (2000)
console.log ("async print 1")
}
const asyncPrint2 = async () =>
{ await sleep (2000)
console.log ("async print 2")
}
const syncPrint = () =>
{ console.log ("sync print")
}
const main = async () =>
{ await asyncPrint1 () // ...2 seconds
await asyncPrint2 () // ...4 seconds
await sleep (1000) // ...5 seconds
syncPrint ()
}
main ()
.then (console.log, console.error)
// async print 1
// async print 2
// sync print
在async
函数中,您可以await
任意数量的其他异步调用-
const sleep = ms =>
new Promise (r => setTimeout (r, ms))
const main = async () =>
{ console.log ("begin")
await sleep (1000)
console.log ("1 second has passed")
await sleep (1000)
await sleep (1000)
console.log ("3 seconds have passed")
await sleep (1000)
await sleep (1000)
await sleep (1000)
console.log ("6 seconds have passed")
}
main ()
.then (console.log, console.error)
// begin
// 1 second has passed
// 3 seconds have passed
// 6 seconds have passed
// undefined