javascript - 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循环之后
电流输出:开始,循环之后,结束
解决方案
您对异步javascript 代码的理解不正确。
传递给的setTimeout
函数不在后台执行 - 它在主线程上执行,并且在该函数执行时,没有其他任何内容执行。
只是在定时器超时,调用栈为空后setTimeout
,回调函数被压入调用栈。这就是为什么其他代码可以在执行的回调函数之前执行。setTimeout
浏览器提供的一些函数(例如 HTTP 请求)在后台发生,一旦完成,Javascript 将调用我们的回调函数,一旦该回调函数开始执行,它会阻止其他所有函数执行,直到该函数从调用堆栈中弹出。
将您的代码放入async
函数中不会使您的代码异步;它将同步执行,直到第一个等待表达式。(Promise 不会使任何事情异步。它们只是一种通知机制,通知您成功完成或已经异步的事情失败。)
您需要的是另一个执行长时间运行的代码而不阻塞主线程的线程。您可以使用浏览器中的web worker或NodeJS 中的工作线程来执行此操作。
推荐阅读
- javascript - 在 Angular 4 中实现承诺时出错
- java - 提交单个属性值而不是整个事务
- python - Networkx - 使用节点属性的子图
- python - 查找嵌套列表中元素的索引
- c# - System.Security.Claims.ClaimsPrincipal.Current(和 HttpContext.Current.User)根据调用者的不同,具有完全相同的请求的不同声明
- javascript - Play 无法引用外部 javascript
- gnuplot - 如何防止图例中的条目重叠而没有空格?
- android - 类型推断失败 Kotlin rxjava 地图使用
- c# - 登录MVC后如何显示用户数据
- android - window.FirebasePlugin.verifyPhoneNumber 函数响应无法使用