2012-11-27 66 views
4

我有一個簡單的「異步」 JS函數執行異步功能之一:JavaScript的:由一個

function asyncFunc(i) { 
    setTimeout(function() { 
     console.log(i); 
    }, 1000); 
} 

,如果我想在for循環中執行該asyncFunc 5倍,即日誌1 - 5每秒,總共花費5秒鐘。

我知道jQuery的時候()()完成可以做到這一點但是如果我在一個環境NO第三方JS庫,什麼是最簡單最優雅的方式來實現這個

其實例如我想要寫它接受的異步函數的陣列的util的功能,並且該util的功能可以在功能逐個執行傳遞:

function execAsyncTasks([asyncTask1, asyncTask2, asyncTask3]) { 
    asyncTask1(); 
    // Wait until asyncTask1 finished 
    asyncTask2(); 
    // Wait until asyncTask2 finished 
    asyncTask3(); 
    // Wait until asyncTask3 finished 
} 
+0

可以給你加您在超時時調用的異步方法的回調參數! – silly

+0

你的帖子的開頭提示你想要「時間安排」,後面的例子表明你只是想一個接一個地執行任務?! – EricG

+0

如果每個任務都必須等到前一個任務完成,那麼它們不是「獨立」的異步任務。你可以用普通的'for'和「異步地」將它們「包裝」起來,使用已經準備好的異步方法運行「包裝器」。 – Passerby

回答

6

您的所有任務都必須實現某種回調機制,因爲這是唯一一種您知道異步任務已完成的方法。有了這樣的,你可以這樣做:

function executeTasks() { 
    var tasks = Array.prototype.concat.apply([], arguments); 
    var task = tasks.shift(); 
    task(function() { 
     if(tasks.length > 0) 
      executeTasks.apply(this, tasks); 
    }); 
} 

executeTasks(t1, t2, t3, t4); 

Demo

+0

NEAT!這就是我想要的,比較簡單,沒有第三方,謝謝! –

2

可以使用異步模塊:

https://github.com/caolan/async

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback); 

async.series([ 
    function(){ ... }, 
    function(){ ... } 
]); 
+0

謝謝你的回答。 – Theo

0

這是很多

一種方法
function execAsyncTasks(asyncTask1, asyncTask2, asyncTask3) { 
    var count = 0; 

    function nextCommand() { 
    switch (count) { 
     case 0: 
     asyncTask1(); 
     break; 
     case 1: 
     asyncTask2();   
     break; 
     case 2: 
     asyncTask3(); 
     default: 
     return; 
    } 
    count++; 
    setTimeout(nextCommand, 1000); 
    } 
    nextCommand(); 
} 
+0

這個問題是無論函數是否完成,count變量都會增加。理想情況下,asyncTask完成後會增加count變量。 – Bruno

+0

其實我使用的是一種方法,我認爲比這個更好: –

+0

var counter = 0; (var i = 0; i <5; i ++)setTimeout(function(){},counter ++ * 1000); } –

0

你可以使用回調和遞歸函數同步機制要求:see http://jsfiddle.net

function asyncFunc(i, callback) { 
    setTimeout(function() { 
     document.body.innerHTML +='<p>'+i+'</p>'; 
     callback(); 
    }, 1000); 
} 

var args = [0,1,2,3,4]; 
function loopThroughArgs(callback) { 
    if(args.length == 0) { 
     callback(); 
    } 
    else { 
     asyncFunc(args[0], function() { 
      args.splice(0,1); //remove the first item from args array 
      loopThroughArgs(callback); 
     });   
    } 
} 
loopThroughArgs(function() { 
    document.body.innerHTML +='<p>done !</p>'; 
});