0

在我的程序中,我声明了一个对象 myObject ,如下所示:

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

我不明白为什么它不起作用。

如何更正我的代码?

4

2 回答 2

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 方法将强制在每次迭代时保存变量的状态。

于 2013-10-23T13:23:10.213 回答
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)();

演示:http: //jsbin.com/ukeBUweG/2/edit

最后一点,上面的解决方案试图忠实于您的初始代码。它不是

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

, 但

function(){ obj1.start(function(){ obj2.start(function(){}) })}();
于 2013-10-23T13:48:41.170 回答