如何子类化jQuery ajax对象或重用常见的回调?

时间:2010-09-07 14:16:35

标签: jquery ajax

我很抱歉模棱两可的标题,但这个问题我很难用语言表达,我似乎只能用代码来形容它。

我有以下功能

function initRPC(procedureName, parameters)
{
    var parcel = //some code that parcels up the procedure name and params

    $.get(
        'url'     : 'rpcserver.php',
        'data'    : parcel,
        'success' : function(returnXML) {
            unparcel = //some code to unwrap the returned data

            /**
             * now instance specific code
             */
        }
    );
}

它说now instance specific code是我想要特定代码的地方,并且重用其余部分,因为initRPC会被频繁调用。

例如,我想像这样启动initRPC:

function getUsername()
{
    alert('Your name is: ' + initRPC('getUsername', { id: someVar }));
}

或者像这样(在这个例子中,initRPC命令的签名将扩展为包括传递的函数引用,但我不知道如何将该引用传递给$ .post回调:

function getUsername()
{
    initRPC('getUsername', {id: someVar}, function todoAfterUnWrap(data) {
        alert('Your name is: ' + data);
    });
}

我无法看到一种做我希望的方式,感觉我总是必须重复$ .ajax()调用,并在每个函数中展开和包装(如getUsername())。

重新说明:如何封装数据准备代码,AJAX请求以及将代码展开在一起,然后允许特定代码在此之后运行。异步。

[edit]现在我想到的是在这种情况下重用代码的典型方法如下:

function getUsername()
{
    var request = prepareRequest('getUsername', { id: someVar });

    $.get(
        'url'     : 'rpcserver.php',
        'data'    : request
        'success' : function(response) {
            response = decodeResponse(response);
            /* instance specific code */
        }
    );
}

也许这是唯一的方法,在我看来要求在每个函数中重复大部分相同的代码,例如getUsername()

1 个答案:

答案 0 :(得分:1)

如果想要发布一个回调函数,那就相当容易了。您可以按照此示例中提供的代码保留代码:

function getUsername()
{
    initRPC('getUsername', {id: someVar}, function todoAfterUnWrap(data) {
        alert('Your name is: ' + data);
    });
}

并像这样写initRPC:

function initRPC(procedureName, parameters, callbackFn)
{
    var parcel = //some code that parcels up the procedure name and params

    $.get(
        'url'     : 'rpcserver.php',
        'data'    : parcel,
        'success' : function(returnXML) {
            unparcel = //some code to unwrap the returned data
            callbackFn(unparcel);
    });
}