如何改进此ajax调用以便可以在全局范围内使用?

时间:2012-01-25 18:30:13

标签: jquery html ajax json

我正在为我的教授建立一个网站,并且我不想重复我的代码,因为我将失败。

我有以下.getJson调用,我想在多个位置使用,这样我就不必多余地重复代码了。

function GetJSON()
{
    var a = $.getJSON("/controller_name/action", null, function (z) {})
    .success(function (z) {
              //Success Action
    })
    .error(function (z) {
              //Error Action
    })
    .complete(function (z) {
              //Complete Action
    });
}

我可以传递成功,错误和完整事件的变量,但我认为这种方式有可能变得非常混乱。有没有办法设置它,以便我不必在我的网站上拥有相同的GetJSON函数。

2 个答案:

答案 0 :(得分:2)

如果您的教授是最新的当前范例,您应该返回 a$.getJSON的返回值)。

这是一个延迟对象,您可以随时附加处理程序,而不必将它们附加到您自己的GetJSON()函数中。

如果您有始终想要发生的常见操作,请将这些操作放在GetJSON()函数中,并使用外部绑定处理程序执行唯一的操作:

function GetJSON()
{
    var a = $.getJSON("/controller_name/action", null, function (z) {
        ...
    });

    // bind functions that you always want to happen here
    a.fail(function(z) {
        console.log("something bad happened");
    });

    return a;
}

var d = GetJSON();

// bind additional functions here
d.done(
     // Success Action
})
.fail(function (z) {
     // Error Action
})
.always(function (z) {
     // Complete Action
});

请注意,jQuery 1.7已弃用.success.error.complete以支持上面使用的函数,以便与其他Deferred对象保持一致。

答案 1 :(得分:1)

我不会说重复代码实际上是恕我直言(除非你做出相同的请求并且每次都更新相同的元素)。如果回调请求url每次都不同,那么实际上并不需要为它写一个'包装器'。

我将其视为“原生”功能的方式。例如。例如console.log()。你不想写一个包裹着你的函数吗?

如果您确实需要/想要这样做,那么您只需将所有参数/回调传递给该函数。