是否有任何原子javascript操作来处理Ajax的异步性质?

puk*_*puk 14 javascript ajax asynchronous atomic

我从服务器动态加载代码(函数)并将其作为javascript代码执行,然后将其存储在数组中并执行.所有这些代码片段必须只执行一次.伪造的代码如下

function fetch(foo){
    if (foo in fooArray){
          //Do Nothing
    else{
          //Fetch foo via Ajax and execute foo()
    }
}
Run Code Online (Sandbox Code Playgroud)

问题要复杂得多,但基本上如果我发出以下命令

fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
Run Code Online (Sandbox Code Playgroud)

所有四个都将执行if (foo in fooArray)并假设它不在数组中,并且所有四个将继续获取代码并执行它.我记得当天回来学习信号量和互斥量,是​​否有javascript这样的东西.

Tom*_*icz 32

JavaScript是一种很好的语言,可以很好地处理异步回调,超时,间隔和用户事件,但没有任何并发​​问题.这是可能的,因为JavaScript基本上是单线程的 - 给定的代码片段总是以原子方式执行,并且永远不会被另一个运行JavaScript的线程中断.

您的fetch()功能将始终执行而不会中断.如果它作为AJAX回调的一部分执行,并且如果有多个AJAX回调挂起,它们将排队.

另一个示例:如果您将一个事件处理程序分配给一个输入元素,并且您一次多次触发该事件,则不会同时执行事件处理程序.相反,它们将按顺序排队并执行.这也适用于由setTimeout()/ 触发的多个事件setInterval().

作为旁注:这是node.js如此健壮的原因之一:它只使用单个线程而且永远不会阻塞I/O,而是在数据就绪/事件发生时使用回调.

  • 严格来说[网络工作者](http://en.wikipedia.org/wiki/Web_Workers)允许并发执行JS,但由于网络工作者和"正常"JS之间的唯一交互是通过消息发生的,你*仍然*不有任何并发​​问题. (6认同)