2011-11-28 55 views
1

我有一些方法(methA,methB ...)需要在Javascript中调用相同的方法methMain。这种方法methMain然后需要获取一些数据,当它完成后,对调用它的方法(methA或MethB ...)进行回调。创建一个参数使用相同的范围参数 - 在Javascript中

我可以成功地创建使用什么这里写指针/引用的方法:How can I pass a reference to a function, with parameters?

该解决方案,我已经看到了所有其他人,似乎并没有在当前范围内工作。 此代码将无法正常工作:

function TestStructure() { 

    this.gotData = false; 

    //define functions 
    this.methA = function (parA) { }; 
    this.methB = function (parb) { }; 
    this.createFunctionPointer = function (func) { }; 


    this.createFunctionPointer = function (func /*, 0..n args */) { 
     var args = Array.prototype.slice.call(arguments, 1); 
     return function() { 
      var allArguments = args.concat(Array.prototype.slice.call(arguments)); 
      return func.apply(this, allArguments); 
     }; 
    }; 

    this.methA = function (parA) { 

     alert('gotData: ' + this.gotData + ', parA: ' + parA); 

     if (this.gotData == false) { 
      var fp = this.createFunctionPointer(this.methA, parA); 
      this.methMain(fp); 
      return; 
     } 

     //...do stuff with data 
    } 

    this.methB = function (parB) { 

     alert('gotData: ' + this.gotData + ', parB: ' + parB); 

     if (this.gotData == false) { 
      var fp = this.createFunctionPointer(this.methB, parB); 
      this.methMain(fp); 
      return; 
     } 

     //...do stuff with data 
    } 

    this.methMain = function (func) { 

     //...get some data with ajax 

     this.gotData = true; 

     //callback to function passed in as parameter 
     func(); 
    } 
} 

var t = new TestStructure(); 
t.methA('test'); 

methMain做一个回调FUNC(methAmethB)变量this.gotData将不会被设置。

有没有针对这个问题的解决方案,还是我需要重新考虑设计? 我想要做到这一点,使用ajax获取数据,而不使用async:false进行阻塞。

回答

0

我不是100%肯定,但我认为你可以做

this.createFunctionPointer = function (func /*, 0..n args */) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    var that = this; //<<< here 
    return function() { 
     var allArguments = args.concat(Array.prototype.slice.call(arguments)); 
     return func.apply(that, allArguments); 
        //here ^^^ 
    }; 
}; 

这将导致你的部分评估功能解决你的问题与创建函数指针一样this被调用。如果你想要一个不同的范围,只需改变你传递给.apply

+0

谢谢你的意见,它现在可以工作 - 这有点令人尴尬,因为我尝试了你在发布之前做过的事情。 :-) – AxAn

相关问题