gpt4 book ai didi

javascript - Javascript Promises库可在浏览器中创建“长时间运行代码-非阻塞UI”?

转载 作者:行者123 更新时间:2023-11-30 17:43:16 25 4
gpt4 key购买 nike

更新资料

这是对以下问题的更新,应有助于找到答案

torazaburo那里得到答案,他也引用了著名的Javascript Promise / A +定义的一部分,我想在这里更新问题。
Promise/A+规范在第2.2.4节中建议:


  在执行之前不得调用onFulfilled或onRejected
  上下文堆栈仅包含平台代码。 3.1。


并进一步解释


  这里的“平台代码”表示引擎,环境和承诺
  实施代码。实际上,此要求可确保
  事件发生后,onFulfilled和onRejected异步执行
  循环转弯,然后再调用,并带有新的堆栈。这可以是
  用“宏任务”机制(如setTimeout或
  setImmediate,或带有“微任务”机制,例如
  MutationObserver或process.nextTick。自承诺实施以来
  被认为是平台代码,它本身可能包含任务计划
  在其中调用处理程序的队列或“蹦床”。


我希望在这个问题上找到的问题的关键是,Promise实现Javascript代码本身被视为平台代码,并且不允许通过调用关联的onFulfilled onRejected函数来解析后续的Promise之间的事件循环。 。这在Node.js(server)中很好,因为它避免了不必要的重新回到事件循环(离开执行栈),但也导致了浏览器的挑战,因为在解决潜在的大问题之间,执行栈没有退出。承诺数(它们本身可以生成新的承诺)。不离开执行堆栈并屈服于事件循环会在浏览器中导致意外事件(阻止脚本警告/问题)。
Promise实现的“蹦床”任务计划会导致这种情况,但是不必时常避免将执行交还给Javascript事件循环。这样的功能将允许使用Promises执行较重的任务。在此问题中搜索/询问了“长时间运行代码”的Promises的这种实现。

说明:“过长”不是onFulfilled函数的单个长度,而是由于Promise解决过程(当以这种“蹦床”方式完成时)将多个这些函数/回调结合在一起。我已经知道,如果一个单独的onFulfilled功能太长,那么使用任何形式的Promise实现都无法以任何方式帮助它。

这里的问题是,对x promise的后续解析(在一个执行堆栈内,因此无需返回Javascript事件循环)可能会导致Java代码执行时间过长。这在浏览器中不好时(由于阻止)。

问题

在Javascript中,Promises允许处理异步编程任务。大!

已经有一些实现和库围绕QWinJSwhen.js仅举几例。
看了之后,我发现它们解决了Javascript异步编程挑战中的一些“特殊问题”。

通常我认为他们这样做是为了兑现承诺


转到内部的承诺清单
检查承诺是否已兑现+运行所有关联的功能(通过then(onFullfilled,onReject))。
(在某些情况下,我们在这里完成了)
(在其他情况下,仍然会有“待定”的承诺)


这种情况(4)是因为要完全履行它们(其余的Promise)将需要当前的Javascript代码(这是用于Promise解析的代码)才能停止运行并允许JS event loop发生(例如XHR-请求或用户界面交互)。为了使此(4)起作用,约定解析通常会安排召回(即通过setTimeout / setImmediate)并在event loop运行后继续执行,因此可能已解决了一些“待处理”的约定(=拒绝/已满)。

我担心的是,步骤1和2可能会运行很长时间,只有在似乎表明要解决一些“待定”承诺的情况下,才将执行释放到event loop。虽然在某些情况下(例如,在服务器/Node.js上)“还可以”,但对于浏览器来说却是个问题,因为即使将执行释放到event loop且UI未被阻塞也没问题,但这是在我见过的诺言的实现中没有完成。

因此,我的问题是:
您是否知道一个关心方面的Promise实现(Javascript Promises库):
在浏览器中制作“长时间运行代码非阻塞用户界面”?

这意味着promise解析将自动将执行释放回event loop,以便CSS动画,用户输入,鼠标交互得到足够的关注,并且不会出现“警告:无响应脚本”消息。

最佳答案

任何符合诺言的实现都不会同步运行then功能,而只会在下一个刻度时运行。因此,您担心“第1步和第2步可能会运行很长时间”是没有根据的。

根据Promises / A +规范:


  在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilledonRejected
  
  这里的“平台代码”是指引擎,环境和承诺实现代码。实际上,此要求确保onFulfilledonRejected在事件循环之后被异步调用,并使用新的堆栈来异步执行。


换句话说,您在2)下的公式不正确。 promises实现不会“运行关联的功能”,而是对其进行调度。

如果处理程序本身是“长时间运行”的代码,那么这将无济于事-实际上没有办法为您提供帮助。

关于javascript - Javascript Promises库可在浏览器中创建“长时间运行代码-非阻塞UI”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20630336/

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