JavaScript功能相同,不同的实现决定了runtme

时间:2016-11-21 12:05:59

标签: javascript jquery

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

我有一个通过SignalR连接到服务器的Web应用程序 如果在运行时使用SignalR连接到服务器有任何问题,我想更改服务功能实现以使用常规XHR。

我有一个带有以下功能的js文件,可通过 SignalR 进行连接:

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

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

另一个具有相同功能的js文件通过 XHR 进行连接:

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

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

我知道不可能同时加载它们 我知道我可以在每个函数中使用一个带有切换的文件。

我想也许我可以通过加载和放大来切换这些文件。在运行时卸载它们。这可能吗?如果是这样,这是解决这个问题的最佳方法吗?

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

2 个答案:

答案 0 :(得分:1)

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

protected void Page_Load(object sender, EventArgs e)
{
    this.DataBind();
}

您也可以将它们分成两个文件并将它们同时添加到MyStuff动态:

;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();

答案 1 :(得分:1)

可以帮助您的一种模式是“懒惰函数定义”或“自定义函数”模式。它由(如其名称所示)在运行时重新定义函数组成。当你的功能必须做一些初步的准备工作而且它只需要做一次时,这很有用。

在您的情况下,这个“准备”工作将选择处理客户端 - 服务器连接的功能。

例如:

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

在处理浏览器及其特性时,这种模式特别方便:

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

在这种情况下,根据特定方法的可用性(或不可用)确定将事件侦听器附加到哪种方式很有用。

但它有它的缺点。例如,您之前添加到原始函数的任何属性在重新定义自身时都将丢失。

希望它有所帮助或者至少能给你一些想法。