JavaScript相同的函数,不同的实现决定于runtme
问题描述:
在运行时更改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
}
我知道不可能让他们在同一时间加载。
我知道我可以在每个函数中使用一个带有切换的文件。
我想也许我可以在这些文件之间切换加载&在运行时卸载它们。这可能吗?如果是这样,这是解决这个问题的最好方法吗?
什么是在运行时提供不同实现的最佳方式?
答
一种方式做到这一点,是定义两个实现与相同签名的对象和刚刚成立的命名空间的变量:
;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 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
与浏览器和他们的特点时,这模式是特别方便
在这种情况下,根据特定方法的可用性(或不确定)确定附加事件侦听器的方式是很有用的。
虽然它有其缺点。例如,以前添加到原始函数的任何属性在重新定义自身时都会丢失。
希望它有助于或至少给你一些想法。
'var func = {success:{//其他功能},失败:{//其他功能}}'如果成功,请使用'func.success' else'func.fail' .. – Rayon
是的,可以使用命名空间。 – Lain
您可以在运行时包含这两个选项,并轻松定义要使用哪一个,但您如何确定该选择?我可以给你一个简单的例子,但没有逻辑来决定使用哪一个,所以你无法做你所要求的。 – Archer