是否有任何原子javascript操作来处理Ajax';什么是异步性?

是否有任何原子javascript操作来处理Ajax';什么是异步性?,javascript,ajax,asynchronous,atomic,Javascript,Ajax,Asynchronous,Atomic,我从服务器动态加载代码(函数)并将其作为javascript代码执行,然后将其存储在数组中并执行。所有这些代码片段必须执行一次。伪代码如下所示 function fetch(foo){ if (foo in fooArray){ //Do Nothing else{ //Fetch foo via Ajax and execute foo() } } 问题要复杂得多,但本质上如果我发出以下命令 fetch('someFunctio

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

function fetch(foo){
    if (foo in fooArray){
          //Do Nothing
    else{
          //Fetch foo via Ajax and execute foo()
    }
}
问题要复杂得多,但本质上如果我发出以下命令

fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');

所有四个都将执行if(foo in fooArray)并假设它不在数组中,所有四个都将继续获取代码并执行它。我记得在学习信号量和互斥量的时候,javascript有这样的功能。

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

您的
fetch()
函数将始终在没有任何中断的情况下执行。如果它作为AJAX回调的一部分执行,并且如果多个AJAX回调处于挂起状态,则它们将排队

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


作为旁注:这是它如此健壮的原因之一:它只使用单线程,从不阻塞I/O,而是在数据准备就绪/事件发生时使用回调。

Javascript本质上是单线程的,因此不需要互斥锁。您的fetch可以设置标志,以便后续的fetch调用可以避免进行ajax调用,例如:

var beingFetched = {};//map onflight -> callbacks
function fetch(foo){
  if (foo in fooArray){
      //Do Nothing
  } else {
      if (beingFetched.foo) { //note empty array is truthy
          //register a callback
          var callback = function(r){
             //anything you need to do wit the return object r
             //maybe even eval it.
          };
          //the callback would more likely be an argument to fetch itself
          //or you could use a promise API instead so that you can at your will
          //register multiple callbacks - for error, for success etc.
          beingFetched.foo.push(callback); 
      } else {
          beingFetched.foo = [];//truthy
          //Fetch foo via Ajax and execute
          $.ajax("getFoo/"+foo).done(function() {
              _.each(beingFetched.foo, function(cb){
                  cb.apply(cb,arguments);
              });
              delete beingFetched.foo;
          });
      }
  }
}

很明显,这是可能的,因为jQuery做到了这一点:我写了一篇关于它的博客,链接被破坏了,应该是:严格地说,允许并发执行JS,但是由于web workers和“普通”JS之间的唯一交互是通过消息进行的,所以您仍然没有任何并发问题。Tomasz我明白您的意思了,thanx。@Tomasz,如果AJAX调用花费的时间太长,可能您不希望挂起太多(根据浏览器的不同超过2或6个),因此我在下面提供了一个缓存解决方案。。你怎么看?异步的,不是并发的。Javascript是并发的,但不是并行的。