JavaScript回调和控制流程

时间:2014-08-19 21:20:26

标签: javascript asynchronous javascript-events control-flow

何时执行回调,例如setTimeout()或click事件的回调? 他们是否暂停已经运行的代码,或者他们是否一直等到它完成了?

实施例 我有一个数据结构(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();

一些好的链接,并且在第一个场景(它暂停运行代码)的情况下是真的,欢迎解决方案。

2 个答案:

答案 0 :(得分:1)

Javascript是单线程的,并且在完成运行当前正在处理的代码后,保留一个事件堆栈。在完成当前事件之前,它不会启动堆栈中的下一个事件。

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

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

答案 1 :(得分:0)

  
    

他们是否暂停已经运行的代码,或者他们是否等到它已经完成?

  

他们等到它完成了。 JavaScript是单线程的,多个代码不能一次运行。 JS使用event loop来处理异步内容。如果在另一段代码运行时发生诸如点击处理程序或计时器触发之类的事件,则该事件将排队并在当前运行的代码完成执行后运行。

假设在同一块代码中调用了makeFullSync();deleteIncrementalChanges();,它们将一个接一个地执行,而不会处理任何点击事件,直到它们都运行完毕。

JS中并行运行的任何内容都是WebWorkers。您可以将数据发送给工作人员进行处理,这将在另一个线程中发生。即使它们并行运行,它们的结果也会像任何其他事件一样插回到事件循环中。