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クロージャでパラメータを結合できますか? したがって、 と の両方をコールバックに渡すのではなく、事前に要素を関数に閉じてから、それを渡します。responseTextelement

したがって、渡さない関数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 に答える