何时执行回调,例如 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/