我知道这听起来很愚蠢,因为javascript是单线程的,但我忍不住会想到这样一个函数,它花费了大量的时间,而没有Web API的参与
console.log("start")
function apple() {
let appleCount = 10;
while (appleCount < 1000000) {
appleCount = appleCount + 10;
appleCount = appleCount * 0.0000052
}
}
apple();
console.log("end")
那么有没有办法异步运行这个苹果函数...我试着在浏览器中运行这个代码,但是没有得到任何结果...帮帮我...。
4条答案
按热度按时间dxpyg8gm1#
要运行像
apple()
函数这样100%纯Javascript的东西,使其不会阻塞主线程,唯一的方法是在不同的线程(在nodejs中,使用WorkerThread)或不同的进程中运行它。正如你所知,主线程在一个线程中运行你的JavaScript,所以任何纯JavaScript的东西在运行时都会占用这个线程。为了不占用这个线程并阻塞事件循环,你必须在一个不同的线程中运行它,或者是
WorkerThread
,或者是在另一个进程中运行它。我们可以使用
setTimeout(apple, 100)
、setImmediate(apple)
甚至Promise.resolve().then(apple)
这样的计时技巧来改变代码运行的时间(延迟它的启动时间),但是所有这些计时技巧所做的只是改变代码开始运行的时间。在所有这些情况下,当代码运行时,它仍然阻塞并占用主线程,并在其运行时阻塞事件循环。仅供参考,nodej中有许多异步操作不一定是Web API。例如,有异步文件API和加密API是异步和非阻塞的。因此,您的问题应修改为不仅指Web API,还指任何异步API。
zsohkypk2#
那么有没有办法异步运行这个apple函数呢?
如果你不想等到你的苹果功能完成,那么你可以使用异步功能。
注意:异步/承诺不是真正的异步。
但是如果您想在另一个线程上运行它,那么您应该使用Workers
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
46qrfjad3#
你只需要履行承诺。
rks48beu4#
我认为不使用内置或平台API就不可能在JavaScript中创建异步,这就是他要问的问题:
正如您所看到的,我仍然不得不使用setTimeout或其他API来模拟异步任务等。