2013-10-23 78 views
0

在我的計劃,我宣佈一個對象myObject的是這樣的:嵌套回調在JavaScript

function myObject() 
{ 
    this.start=start; 
    function start(callbackFunction) 
    { 
    // Do something with callbackFunction 
    } 
} 

在我的main()方法,我創建對象,我要開始嵌套的回調是這樣的:

var myObject1 = new myObject(); 
var myObject2 = new myObject(); 

var list = []; 
list.push(myObject1); 
list.push(myObject2);  

var result = function() {}; 
var obj; 
for (var i=list.length-1; i>=0; i--) { 
    obj = list[i];   
    result = function() { obj.start(result);} 
} 
result(); // I want to do myObject1.start(myObject2.start)); e.g. a nested callback 

我不明白爲什麼它不起作用。

如何更正我的代碼?

回答

1

結果變量在每次迭代後重新定義。

你需要設置你的函數,像這樣:

var myObject1 = new myObject(); 
var myObject2 = new myObject(); 

var list = []; 
list.push(myObject1); 
list.push(myObject2);  

var result= function() {}; 
for (var i=list.length-1; i>=0; i--) { 
    var obj = list[i]; 
    result = obj.start.bind(obj, result); 
} 
result(); 

使用bind方法將迫使變量的狀態,以在每次迭代保存。

+0

你是對這個問題,但解決的辦法是行不通的。使用的原始代碼沒有參數作爲回調函數,您可以使用帶有1個參數的函數。如果myObject使用callback作爲'callback()',那麼第一個調用就會成功(它會是'function(){}()'),但是第二個調用不會好(它將會是'undefined() ')。 – Tibos

+0

它不起作用...它有一種遞歸函數的方式? – Scanpat

+0

我的不好。在這裏,它已被糾正。 – hazerd

0

問題是您沒有正確使用閉包。

在for循環中,您聲明瞭一個使用外部作用域(結果)中的變量的函數。當for循環結束時,結果變量將包含最後定義的函數,而不是您在第i步中定義的那個函數。當你在一個註解,因此很好的暗示

一種解決方案是遞歸性:

function myObject(name) 
{ 
    this.name = name; 
    this.start= function(callbackFunction) { 
    console.log(this.name); 
    // Do something with callbackFunction 
    callbackFunction(); 
    }; 
} 

var myObject1 = new myObject(1); 
var myObject2 = new myObject(2); 

var list = []; 
list.push(myObject1); 
list.push(myObject2);  

var runner = function(list, currentIndex) { // recursive function 
    if (currentIndex < 0) return function(){ console.log('INITIAL');}; 
    return function(){ 
    list[currentIndex].start(runner(list, currentIndex-1)); 
    }; 
}; 

runner(list, list.length-1)(); 

DEMO:最後http://jsbin.com/ukeBUweG/2/edit

一個注意,上述解決方案試圖忠於你的初始代碼。這不是

obj1.start(obj2.start(function(){})) 

,但

function(){ obj1.start(function(){ obj2.start(function(){}) })}(); 
+0

謝謝!有用 ! – Scanpat