2013-03-15 38 views
1

我試圖設置一個函數,該函數存儲可以稍後在事件上觸發的回調,但是我沒有獲取綁定正確的上下文。設置基本上是這樣的:JS在傳遞之前綁定函數的上下文

app.myObject = function(){ 
    this.bindEvents(); 
}; 
app.myObject.prototype = { 
    bindEvents: function(){ 
    var self = this; 
    this.library = new OutsideLibrary(); 
    this.library.onMyEvent = function(data) { 
     OtherLibrary.processData(data, self.runCallback); // I'm not able to pass a context here... 
    } 
    }, 
    sendToLibrary: function(message,callback) { 
    this.callback = callback; 
    this.library.send(message); 
    } 
    // ... and this doesn't work because it gets evaluated in the wrong context. 
    runCallback: function() { 
    if (this.callback) { 
     this.callback(); 
     this.callback = null; 
    } 
    } 
} 

我希望上面的代碼有意義。我的想法是,我試圖公開一個API,我可以打電話:

app.myObject.sendToLibrary("something", function() {...}); 

...並且回調函數將在整個鏈完成後運行。

問題是,我無法直接通過在sendToLibrary中收到的回調,因爲回調需要在事件觸發時傳遞給另一個對象。另外,由於我不得不存儲當前傳遞的回調,並且回調是可選的,所以我需要在它啓動後取消設置,所以實際上我需要通過runCallback函數來運行回調,然後取消設置。

無論如何,問題是,當最終得到執行runCallback它不再在正確的上下文中,所以它不起作用。我的第一個想法是修改runCallback函數以包含一個上下文參數,所以我可以通過self.runCallback(self) - 但它會立即執行,所以它會破壞目的。

無論如何,我有點失去了在這裏的回調樹林,並希望得到一些幫助尋找我的出路:)

我的問題是:有沒有辦法來結束一個回調函數和正確的上下文,而不是現在執行它,以便當它最終觸發時,它從正確的上下文中這樣做?

謝謝!

+0

'我不能在這裏傳遞一個上下文'你不能使用'.call(context)'語法來調用'runCallback'嗎? – fardjad 2013-03-15 20:06:59

+0

據我瞭解,'.call()'立即執行該函數,但我需要將它傳遞,尚未執行,以便'OtherLibrary'在完成它的東西時執行它。 – Andrew 2013-03-15 20:13:37

回答

1
OtherLibrary.processData(data, function() { 
    self.runCallback(); 
)}; 

然後裏面的runCallbackthisapp.myObject一個實例,如果這是你想要的。

+0

* facepalm *。是的,這很簡單。 – Andrew 2013-03-15 20:32:28

1

安德魯,我想你可能會在這裏嘗試一點。

如果你正在尋找做的是結合上下文,您可以執行下列操作之一:

var working_method = context.method.bind(context); 
// bind is IE9+, and does something similar to the below 

// or, from whatever scope your context/method are available in, define this function 
var working_method = function() { context.method(); }; 

如果您需要的參數,並且您已經知道了足跡:

var working_method = function (a, b, c) { context.method(a, b, c); }; 

可變參數長度的解決方案(即:廣義的「綁定」方法)較長,但如果您正在定義一行東西,我所得到的東西可能就是您所需要的。

只要確保在包裝函數中不使用this(無論是將其保存爲var還是將其直接傳遞到另一個函數),因爲它將引用window

+0

綁定是IE9 + ^^ – zeroflagL 2013-03-15 20:24:44

+0

嗯 - 感謝捕捉。固定。 – Norguard 2013-03-15 20:28:35

+0

這就是IE的問題:你認爲有些東西是支持的,但它永遠不會;) – zeroflagL 2013-03-15 20:30:05

相關問題