首页 > 解决方案 > JavaScript中的自定义异步函数不起作用

问题描述

console.log('Start');
const myFunc = async () => {
 for(let i=0; i<10000000000000; i++){}
 console.log('After for loop');
}
myFunc();
console.log('end');

我想要使​​用 async/await 的异步行为。我希望我的函数将整个函数传递给与 SetTimeout 相同的事件循环,SetInterval 这样做以便我的主线程可以继续完成其余的工作,除非该繁重的功能正在后台运行。

预期输出:开始、结束、for循环之后

电流输出:开始,循环之后,结束

标签: javascriptnode.jsasynchronousasync-await

解决方案


您对异步javascript 代码的理解不正确。

传递给的setTimeout函数不在后台执行 - 它在线程上执行,并且在该函数执行时,没有其他任何内容执行。

只是在定时器超时,调用栈为空setTimeout,回调函数被压入调用栈。这就是为什么其他代码可以在执行的回调函数之前执行。setTimeout

浏览器提供的一些函数(例如 HTTP 请求)在后台发生,一旦完成,Javascript 将调用我们的回调函数,一旦该回调函数开始执行,它会阻止其他所有函数执行,直到该函数从调用堆栈中弹出。

将您的代码放入async函数中不会使您的代码异步;它将同步执行,直到第一个等待表达式。(Promise 不会使任何事情异步。它们只是一种通知机制,通知您成功完成或已经异步的事情失败。)

您需要的是另一个执行长时间运行的代码而不阻塞主线程的线程。您可以使用浏览器中的web worker或NodeJS 中的工作线程来执行此操作。


推荐阅读