1

这是一个代码设计问题。

最初我是这样使用 Ajax 的:

原始 Ajax 调用

Ajax.repeatUse( ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn', ajaxTypeRespond, this.response_element );

ajaxTypeRespond成功的 ajax 调用的回调函数在哪里。

问题是,我必须将所需的参数传递给回调函数,在这种情况下只有this.response_element. 这很尴尬,因为它实际上并没有在 ajax 调用中使用,而是简单地传递给回调函数的调用。

此外,随着功能的增长,此参数列表会不断增长。

我想要做的只是返回 responseText,然后将所需的参数组合成一个像这样的新函数调用。

需要 Ajax 调用

var server_response_text = AjaxNew.use( ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn' );
ajaxType( server_response_text, this.response_element, 'respond' ); 

现在的问题是, server_response_text 没有定义,因为它不是同步函数( Ajax )。有没有办法等到设置好后再打电话ajaxType

我有 IE 10230 错误的循环..它与这个问题无关..但我发现这个例子很难删除。下面是我的带有循环的 Ajax 函数。

Ajax 函数

var Ajax = function()
{
};

Ajax.create = function()
{
    var request;
    try
    {
        request = new XMLHttpRequest();
    }
    catch( error )
    {
        try 
        {
            request = new ActiveXObject( "Msxml2.XMLHTTP" );
        }
        catch( error )
        {
            try
            {
                request = new ActiveXObject( "Microsoft.XMLHTTP" );
            }
            catch( error )
            {
                request = false;
            }
        }
    }
    return request;
};

Ajax.use = function( param, ajax_func, element )
{
    var object = Ajax.create();
    object.open( "POST", CONSTANT.GATEWAY, true );
    object.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
    object.setRequestHeader( "Content-length", param.length );
    object.setRequestHeader( "Connection", "close" );
    object.onreadystatechange = function()
    {
        if( this.readyState === 4 )
        {
            if( this.status === 200 )
            {
                ajax_func( this.responseText, element );
                return true;
            }
            else
            {
                Ajax.repeatUse( ajax_func, element );
                return false;
            }
        }
    };
    object.send( param );
    return true;
};

Ajax.repeatUse = function( param, ajax_func, element )
{
    var state = false,
        count = 1;
    while( state === false && count <= 5 )
    {
        state = Ajax.use( param, ajax_func, element );
        if( count !== 1 )
        {
            alert( 'Ajax Object Use Failed ');
        }
        count++;
    }
    return state;
};
4

1 回答 1

1

你能把element参数组合在一个闭包中吗?因此,您不会同时传递responseText和传递element给回调,而是预先将元素关闭到函数,然后将其传递。

所以你的功能没有通过element

Ajax.use = function( param, ajax_func ) {
    ...
            if( this.status === 200 )
            {
                ajax_func( this.responseText );
                return true;
            }
            else
            {
                Ajax.repeatUse( param, ajax_func );
                return false;
            }
        }
    };
    ...
};

Ajax.repeatUse = function( param, ajax_func ) {
    ...
        state = Ajax.use( param, ajax_func );
    ...
};

并使用:

function createCallback (element, callback) {
    return function (responseText) {
        // Here you can use both element and responseText
        // What we do is call the 'original' callback,
        // with both element and responseText
        callback(responseText, element);
    };
}

var data = ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn';

Ajax.repeatUse( data, createCallback (this.response_element, ajaxTypeRespond) );

您可以通过简单地将更多参数传递给createCallback().

于 2012-04-03T21:22:30.087 回答