gpt4 book ai didi

Javascript 异步 promise 作为宏任务

转载 作者:行者123 更新时间:2023-12-01 00:23:31 25 4
gpt4 key购买 nike

在我的应用程序中,有时我通过 Promise 将如此多的微任务排队,导致 UI 被阻塞并变得无响应。

有什么方法可以以类似的方式将它们作为宏任务排队吗?使用 setTimeout() 工作正常,UI 再次变得响应,但代码非常丑陋,让我陷入回调 hell 。

提前致谢!

最佳答案

如果您排队的 promise 足够多,导致 UI 饥饿,因为 promise 的运行优先级高于许多其他类型的事件,那么您可能只是试图一次运行太多异步操作,或者以某种方式编写代码创造了太多必须安排并与其他事情竞争的 promise 。

解决此问题的正确方法可能是修复您的代码,这样它就不会尝试创建那么多 promise 。只有当您向我们展示实际导致该问题的代码时,我们才能帮助您。

Is there any way I can queue them as macrotasks in a similar way?

内置于 JS 中的 Promise 实现无法配置 Promise 的调度方式,因此它们被硬连接为使用比事件队列中的许多其他任务优先级更高的微任务,并且您无法更改它。

您可以获得一个第三方库(在 JS 内置 Promise 之前为 Promise 使用而构建的库),该库无法访问微任务系统,并且会使用诸如 setTimeout()setImmediate()。但是,您必须以某种方式确保所有代码都切换到这个第三方库,而不是无意中使用内置实现。

老实说,这感觉像是一个彻底的黑客攻击,并不是我想要的解决方案。单线程JS是一个协作系统。为了保持 UI 响应,它依赖于一些合作,而不是用高优先级或长时间运行的操作来敲击主线程,以保持 UI 响应。

在某些情况下,您可以将一些代码移出到 webWorker(如果这是浏览器)或 WorkerThread(如果这是 Node.js),并将麻烦的代码从与 UI 相同的事件循环中取出。

但是,最好的解决方案可能是驯服您的 Promise 驱动的代码,这样它就不会连续运行太多 Promise 计划的事情,从而干扰 UI。如果您向我们展示实际导致问题的 promise 代码,我们只能帮助您提供一些如何做到这一点的想法。

关于Javascript 异步 promise 作为宏任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59207082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com