2012-06-24 101 views
4

我想多次調用一個函數,每次都提供不同的輸入,但是我試圖確保在前一個函數完成後觸發下一個函數調用。相同功能的回調

例如:

func(1,2); 
func(9,3); 
func(6,4); 
func(5,6); 

我看到的回調被編碼等等;

function1(someVariable, function() { 
      function2(someOtherVariable); 
     }); 

但是這隻適用於調用第二個函數時,我試圖鏈接功能,但這隻允許我運行一組函數。

有沒有辦法可以將某種回調應用到相同的功能?

note ::該函數只是添加一個類。

func(x, y){ 
    $("#block").addClass("class"); 
    setTimeout(function(){ 
     $("#block").removeClass("class"); 
    },1000); 
}; 
+0

下面的僞代碼'我想調用一個函數多次提供不同的輸入,但是我試圖確保下一個函數調用在前一個函數調用完成後觸發。=>這就是你顯示的前四行代碼do =>它們使用不同的參數執行相同的功能,並按順序執行=> th直到前一個完成,下一個呼叫纔會執行。 –

+0

確定函數中有延遲,後面的調用不會等待前一個結束。 – Lunar

+0

這些延遲是否爲您提供回調?他們如何實施?這些延誤到底是什麼?你在談論一些異步處理,比如AJAX調用嗎?如果是這樣,請更詳細地描述這個'func'的功能。 –

回答

4
function func(x,y,callback) { 
    console.log(x,y); 
    $("#block").addClass("class"); 
    setTimeout(function(){ 
     $("#block").removeClass("class"); 
     callback(); 
    },1000); 
}; 

var params = [ 
    [1,2], 
    [9,3], 
    [6,4], 
    [5,6] 
], i = 0; 

function fn() { 
    if(params[i]) { 
     func(params[i][0], params[i++][1], fn); 
    } 
} 

fn(); 

只要有剩餘的參數就會繼續。

小提琴:http://jsfiddle.net/sabithpocker/dQX6s/

2

您可以修改func函數時,函數成功,這將代表執行的回調一個附加參數:

func(x, y, finished) { 
    $("#block").addClass("class"); 
    window.setTimeout(function() { 
     $("#block").removeClass("class"); 
     finished(); 
    }, 1000); 
}; 

,然後鏈中的呼叫:

func(1, 2, function() { 
    func(9, 3, function() { 
     func(6, 4, function() { 
      func(5, 6, function() { 
       alert('all done'); 
      }); 
     }); 
    }); 
}); 
+0

是的,這是我正在玩的,它工作正常,有沒有辦法做到這一點,如果你不知道有多少電話將被作出的功能? – Lunar

+0

當然,這很容易。我會舉一個例子。 –

0

我想我們應該使用jQuery的可用承諾模式,允許回調的鏈接,而無需複雜的語法解決這個問題請參閱參考

function func(value1, value2) { 
      var deffered = jQuery.Deferred(); 
      alert(value1); 
      deffered.resolve(); 
      return deffered; 
     } 

jQuery.when(func(1, 2)).then(func(2, 3)).then(func(3,4));