1

我有以下两个功能:

function mvcOnFailure(message) {

    $.modal({
        title: "MVC Error",
        closeButton: true,
        content: message,
        ...
    });
}

function ajaxOnFailure(ajaxContext) {

    $.modal({
        title: "Ajax Error",
        closeButton: true,
        content: ajaxContext.responseText,
        ...
    });
}

他们都做同样的事情(省略了一些行),但采用不同的论点。有什么方法可以组合这些功能。我在想的是以某种方式拥有一个功能来完成大部分工作,例如打开对话框,然后让另外两个从中继承。

4

4 回答 4

3

我在想的是以某种方式拥有一个功能来完成大部分工作,例如打开对话框,然后让另外两个从中继承。

不是继承,但是是的,将公共代码放在第三个函数中并从其他两个函数中调用它。非常粗略:

function mvcOnFailure(message) {

    doTheCommonStuff("MVC Error", message /*, other, stuff */);
}

function ajaxOnFailure(ajaxContext) {

    doTheCommonStuff("Ajax Error", ajaxContext.responseText /*, other, stuff */);
}

function doTheCommonStuff(title, content /*, other, stuff */) {
    $.modal({
        title: title,
        closeButton: true,
        content: content
        ...
    });
}
于 2012-05-06T08:29:53.900 回答
0

您可以对两个回调使用相同的函数。您所要做的就是检查您的参数,例如在这种情况下,我会尝试查看它是一个对象还是一个字符串(不熟悉 MVC,但我认为它会是一个对象)。

然而,这可能很棘手(甚至不可能),并且它可以被认为是错误的编码(本质上是传递一个控制变量选择要执行的代码),因此保留函数但调用通用函数来格式化/创建输出可能是更好的解决方案.

于 2012-05-06T08:31:08.293 回答
0

我想message参数是差异。因此,应该可以将这两个功能合二为一:

function mvcOrAjaxOnFailure(message) {
    $.modal({
        title: message.responseText ? "Ajax (XHR) Error" : "MVC Error",
        closeButton: true,
        content: message.responseText || message,
        ...
    });
}
于 2012-05-06T08:55:46.167 回答
0

在 ES5 中,您不仅可以使用bind来创建具有不同上下文对象的新函数,还可以执行柯里化(http://en.wikipedia.org/wiki/Currying):

function displayModal(title, message) {
    $.modal({
        title: title,
        closeButton: true,
        content: message,
        ...
    });
}

var mvcOnFailure = displayModal.bind(undefined, "MVC Error");
var ajaxOnFailure = displayModal.bind(undefined, "Ajax Error");

现在您有两个新displayModal函数,其中第一个参数 ( title) 已设置。因此,例如,当您致电时:

mvcOnFailure("foo");

“foo”将是message参数,并title自动成为“MVC 错误”。

于 2012-05-06T09:36:20.137 回答