JavaScript相同的函数,不同的实现取决于runtme

JavaScript相同的函数,不同的实现取决于runtme,javascript,jquery,Javascript,Jquery,在运行时更改JavaScript实现的最佳方法是什么 我有一个通过连接到服务器的web应用程序。 如果在运行时使用SignalR连接到服务器时出现任何问题,我希望将服务函数实现更改为与常规XHR一起使用 我有一个js文件,其中包含以下功能,可通过信号器连接: function initializeConnection() { // Initialize connection using SignalR } function sendEcho() { // Sending ech

在运行时更改JavaScript实现的最佳方法是什么

我有一个通过连接到服务器的web应用程序。
如果在运行时使用SignalR连接到服务器时出现任何问题,我希望将服务函数实现更改为与常规XHR一起使用

我有一个js文件,其中包含以下功能,可通过信号器连接:

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

function sendEcho() {
    // Sending echo message using signalR
}
function initializeConnection() {
    // Initialize connection using XHR
}

function sendEcho() {
    // Sending echo message using XHR
}
以及另一个具有相同功能的js文件,用于通过XHR连接:

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

function sendEcho() {
    // Sending echo message using signalR
}
function initializeConnection() {
    // Initialize connection using XHR
}

function sendEcho() {
    // Sending echo message using XHR
}
我知道不可能同时加载它们。
我知道我可以在每个函数中使用一个带有切换的文件

我想也许我可以通过在运行时加载和卸载这些文件来在它们之间切换。这可能吗?如果是的话,这是解决此类问题的最佳方式吗


在运行时提供不同实现的最佳方法是什么?

一种方法是将两种实现定义为具有相同签名的对象,并将名称空间设置为变量:

;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 = {..};

一种可以帮助您的模式是“惰性函数定义”或“自定义函数”模式。它包括(正如其名称所指出的)在运行时对函数的重新定义。当您的功能需要做一些初始准备工作并且只需要做一次时,它非常有用

在您的情况下,这个“准备”工作将是选择处理客户机-服务器连接的函数

例如:

var sendMessage=function(){
//执行检查,或使用默认连接尝试第一条消息
//根据结果,相应地重新定义函数
sendMessage=sendMessageUsingWhatever;
};

//在任何地方使用sendMessage,它都将使用适当的协议
var func={success:{//OTHER FUNCTIONS},fail:{//OTHER FUNCTIONS}
如果成功,则使用
func.success
else
func.fail
。是的,可以使用名称空间。您可以在运行时包含这两个名称空间并轻松定义要使用的名称空间,但是你如何决定这个选择呢?我可以给你一个简单的例子,但是如果没有逻辑来决定使用哪一个,你就无法按照你的要求去做。@Rayon的回答是一个很好的方法来决定使用哪一个实现来连接到服务器。默认情况下,我从SignarR开始,如果它在初始化期间或在发送回显消息时失败,那么我应该切换到使用XHR来实现连接到服务器的所有功能。