2016-11-21 38 views
4

在運行時更改JavaScript實現的最佳方式是什麼?JavaScript相同的函數,不同的實現決定於runtme

我有一個web應用程序,它通過SignalR連接到服務器。
如果在運行時使用SignalR連接到服務器時有任何問題,我想更改服務功能實現以使用常規XHR。

我有以下功能一個js文件通過SignalR連接:通過XHR

function initializeConnection() { 
    // Initialize connection using SignalR 
} 

function sendEcho() { 
    // Sending echo message using signalR 
} 

而另一JS與連接相同功能的文件:

function initializeConnection() { 
    // Initialize connection using XHR 
} 

function sendEcho() { 
    // Sending echo message using XHR 
} 

我知道不可能讓他們在同一時間加載。
我知道我可以在每個函數中使用一個帶有切換的文件。

我想也許我可以在這些文件之間切換加載&在運行時卸載它們。這可能嗎?如果是這樣,這是解決這個問題的最好方法嗎?

什麼是在運行時提供不同實現的最佳方式?

+2

'var func = {success:{//其他功能},失敗:{//其他功能}}'如果成功,請使用'func.success' else'func.fail' .. – Rayon

+0

是的,可以使用命名空間。 – Lain

+0

您可以在運行時包含這兩個選項,並輕鬆定義要使用哪一個,但您如何確定該選擇?我可以給你一個簡單的例子,但沒有邏輯來決定使用哪一個,所以你無法做你所要求的。 – Archer

回答

1

一種方式做到這一點,是定義兩個實現與相同簽名的對象和剛剛成立的命名空間的變量:

;var MyStuff = { 
    //SignalR 
    SignalR: { 
     initializeConnection: function(){console.log('SignalR.initializeConnection()')}, 
     sendEcho: function(){console.log('SignalR.sendEcho()')} 
    }, 

    //XHR 
    XHR: { 
     initializeConnection: function(){console.log('XHR.initializeConnection()')}, 
     sendEcho: function(){console.log('XHR.sendEcho()')} 
    } 
}; 

//Do whatever check you want to 
var mNamespace = (1 === 2) ? MyStuff.SignalR : MyStuff.XHR; 

//Call the instance 
mNamespace.initializeConnection(); 

您也可以將它們分割在兩個文件並把它們添加到MyStuff動態地:

//File 1 
;var MyStuff = (MyStuff === undefined) ? {} : MyStuff; 
MyStuff.SignalR = {..}; 

//File 2 
;var MyStuff = (MyStuff === undefined) ? {} : MyStuff; 
MyStuff.XHR = {..}; 
1

可以幫助你的一種模式是「懶惰函數定義」或「自定義函數」模式。它由(正如其名稱所指出的)在運行時重新定義一個函數。當你的功能需要做一些初步的準備工作,而且它只需要做一次就很有用。

在你的情況下,這個「準備工作」將選擇處理客戶端 - 服務器連接的函數。

例如:

var addHandler = document.body.addEventListener ? 
 
    function(target, eventType, handler) { 
 
    target.addEventListener(eventType, handler, false); 
 
    } : 
 
    function(target, eventType, handler) { 
 
    target.attachEvent("on" + eventType, handler); 
 
    };

var sendMessage = function() { 
 
    // Perform a check, or try a first message using your default connection flavour 
 
    // Depending on the result, redefine the function accordingly 
 
    sendMessage = sendMessageUsingWhatever; 
 
}; 
 

 
//Use sendMessage anywhere you want, it'll use the proper protocol

與瀏覽器和他們的特點時,這模式是特別方便

在這種情況下,根據特定方法的可用性(或不確定)確定附加事件偵聽器的方式是很有用的。

雖然它有其缺點。例如,以前添加到原始函數的任何屬性在重新定義自身時都會丟失。

希望它有助於或至少給你一些想法。

相關問題