2011-12-29 86 views
1

例如,可以說我做了一個叫做「foobar」的函數,而foobar裏面是對異步函數的調用。例如,它可能是這樣的:如果我在JavaScript中只包含異步函數的函數,新函數是否也是異步的?

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

現在,如果我叫foobar的()五次這樣的:

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

請問它只是火在同一時間兩個異步功能呢?

回答

2

不,它會觸發全部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

1

異步函數的主要特點是它立即返回,稍後執行它的工作,然後通常通過回調通知調用者其工作已完成。

因此,在你的榜樣,五次調用foobar()將導致異步函數共被解僱了,因爲所有的人都會立即返回到調用者。

0

我想每個調用的所有異步功能時foobar()在內存

0

創建一個新的副本,調用內部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

0
 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個異步方法。