如果我在JavaScript中只包含异步函数的函数,新函数是否也是异步的?

问题描述:

例如,可以说我做了一个叫做“foobar”的函数,而foobar里面是对异步函数的调用。例如,它可能是这样的:如果我在JavaScript中只包含异步函数的函数,新函数是否也是异步的?

function foobar() { 
    // asynchronous function here. 
    // asynchronous function here. 
} 

现在,如果我叫foobar的()五次这样的:

foobar(); 
foobar(); 
foobar(); 
foobar(); 
foobar(); 

请问它只是火在同一时间两个异步功能呢?

不,它会触发全部10.它会触发前两个(异步),然后单个Javascript线程将从第一个调用返回并进入第二个,再调用两个等等。直到所有10个被调用。例如:

var i = 0; 
function foobar(){ 
    // Execute functions asynchronously by using setTimeout 
    setTimeout(function(){ alert(++i); }, 0); 
    setTimeout(function(){ alert(--i); }, 0); 
} 

foobar(); 
foobar(); 
foobar(); 
foobar(); 
foobar(); 
alert('This will ALWAYS alert first'); 

最后警报将始终警报第一因为JavaScript是单线程的,之后,其他的警报将在根据调度任何顺序发生。您可能会看到提醒-5和5之间的任意数字,但最后警报将始终为0

http://jsfiddle.net/Paulpro/uJd44/

+0

有趣!第一次警报和所有其他警报之间有什么延迟? – trusktr 2011-12-29 07:59:28

+0

而且,你可以通过像setTimeout那样使任何函数异步? – trusktr 2011-12-29 08:00:38

+0

@trusktr它与警报的阻塞性质有关。我不确定为什么浏览器需要一点时间才意识到它不再被阻塞,并且可以切换线程,但似乎是这样。如果您将警报更改为“控制台”。log()'你不会看到这种情况发生(但是执行速度非常快,以至于线程几乎*会按照它们发生的顺序排定,所以你会看到1 0 1 0 1 0 1 0作为输出。 – Paulpro 2011-12-29 08:05:58

异步函数的主要特点是它立即返回,稍后执行它的工作,然后通常通过回调通知调用者其工作已完成。

因此,在你的榜样,五次调用foobar()将导致异步函数共被解雇了,因为所有的人都会立即返回到调用者。

我想每个调用的所有异步功能时foobar()在内存

创建一个新的副本,调用内部foobar的异步功能的总量将是10(5 * 2)。

foobar中的函数是异步的,所以foobar会在其他函数仍然忙的时候结束。然后,接下来的foobar的叫,发射另外两个异步函数,等等等等

当然,你可以建立一个调节器,当你后对方很快火foobar的限制呼叫的数量...

+0

你能描述一下这个节流你说的? – trusktr 2011-12-29 07:54:17

+0

您可以在这里使用现有的http://benalman.com/projects/jquery-throttle-debounce-plugin/(也可以在没有JQuery的情况下运行)或在此处阅读http://remysharp.com/2010/07/21/throttling-function-calls /但通常情况下,调节器使用setTimeout()函数来确保任何给定的函数仅在这么多毫秒内执行一次。 – 2011-12-29 08:05:26

 foobar(); // It will invoke two asynchronous function and even if they are not 
       //completely executed control will got to second/next foobar() method invocation 
     foobar(); // Irrespective of whether first two asynchronous function have 
        //completed or not this method will invoke two asynchronous functions 
       // again. and next //foobar() method call will be executed 

     foobar(); // Same continues 
     foobar(); 
     foobar(); 

考虑是否即使在调用最后一个foobar()方法后,也没有任何异步方法已经完成执行,因此将会执行10个异步方法。