JavaScript 回调和控制流

标签 javascript asynchronous dom-events control-flow

何时执行回调,例如 setTimeout() 或点击事件的回调? 他们是暂停已经运行的代码,还是等到它完成?

示例

我有一个数据结构 (incrementalChanges),用于记录由用户交互(例如鼠标单击)引起的状态更改。如果我想将所有更改发送给另一个对等点,我会向他发送这个数据结构。

另一种可能性是完全同步 (makeFullSync()),这意味着我向他发送完整的当前状态,以便我必须清空增量更改 (deleteIncrementalChanges()) >)。也就是您在代码中看到的内容。但是我不确定,如果用户在这两个函数调用之间准确地单击某些内容,会发生什么。如果此事件立即触发,则将向 incrementalChanges 结构添加一个项目,但随后在第二次调用中直接删除,这样它就永远不会被发送,并且另一个对等点的状态将变得无效。

makeFullSync();
/* what if between these 2 calls a new change is made, that is saved in the
   changes data structure, that will be deleted by deleteIncrementalChanges()?
   Then this change would be lost? If I change the order it is not better ...
*/
deleteIncrementalChanges();

一些很好的链接,如果第一种情况(它暂停运行代码)是正确的,欢迎解决方案。

最佳答案

Javascript 是单线程的,并且会保存一个事件堆栈,其中包含在运行完当前正在处理的代码后需要访问的内容。在当前事件完成之前,它不会启动堆栈中的下一个事件。

如果您进行多个异步调用,例如调用服务器更新另一个客户端上的数据,您需要构建代码来处理它们不一定以相同顺序到达第二个客户端的情况。

如果您一次向另一个用户发送一个更改,您可以为这些更改添加时间戳,以跟踪它们在第一个客户端上的顺序。

关于JavaScript 回调和控制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393168/

相关文章:

javascript - 从 XHR 获取方法和 url

javascript - 将 <a> 添加到 <h3> 中的每个单词

arrays - Swift:如何在循环中逐个 rm Alamofire 获取请求

javascript - 如何从异步调用返回响应?

javascript - 如何阻止网页使用 Firefox CAPS 策略捕获按键?

javascript - 使用命令清除控制台

javascript - React-navigation重置说明

c# - await 在转移到与调用者相同的线程之前是否在内部创建另一个线程(对于 UI 应用程序)

javascript - 如何检查当前浏览器选项卡的 url 是否已更改?

javascript - 在旧版 Internet Explorer 中的事件重定向期间检查一个事件是否与另一个事件相同