0

Ajax リクエストの結果をトリガー関数に返そうとしています。しかし、私の答えは「途中で失われた」です...

これは私がやっていることです:

 some = function (){
     // inside some function - this will call getItems()
     content = $.parseJSON( dynoData[ dyn.method ]() );
 };

...
dynoData = {
    getItems : function(){

        var form = "",
        service = "../services/pull_items.cfc",
        method = "process",
        returnformat = "JSON",
        targetUrl = "",
        formdata = "form=getItems&method="+method+"&returnformat="+returnformat,
        successHandler = function(objResponse) {
            // here is the objResponse I need to pass back
            console.log( objResponse );
            return ( objResponse );
        };

    ajaxFormSubmit( form, 
                    service, 
                    formdata, 
                    targetUrl, 
                    successHandler, 
                    "yes", 
                    "", 
                    returnformat, 
                    "" );
    }


ajaxFormSubmit = function ( form, 
                            service, 
                            formdata, 
                            targetUrl, 
                            successHandler, 
                            dataHandler, 
                            errorHandler, 
                            returnformat, 
                            type ){     
    $.ajax({
        async: false,
        type: type == "" ? "get" : type,
        url: service,
        data: formdata,
        dataType: returnformat,
        success: function( objResponse ){
            if (objResponse.SUCCESS == true || 
                    typeof objResponse == "string" ){
                dataHandler == "yes" ? 
                    successHandler( objResponse ) : successHandler();   
            }
        },  
        error: function () {}
    });
}

objResponeすべてが正しく動作しますが、Ajax サクセスハンドラーから getItems 関数を介して call 関数に戻す方法がわかりません。

質問:
誰かヒントを教えてください。

ありがとう!

編集:次
のように機能します:

// inside some function
var content,
    cbk = function(objResponse){
        content = objResponse;
        };

// get dynamic data
$.parseJSON( dynoData[ dyn.method ](cbk) );

console.log( content );
}

// inside getItems
getRetailers : function(cbk){
    ...
    successHandler = function(objResponse, cbk) {
        cbk( objResponse );
        };
ajaxFormSubmit( form, service, formdata, targetUrl, successHandler, "yes", "", returnformat, cbk )
}

cbkそのため、代わりに渡す最後のパラメーターをハイジしていますget/post

var ajaxFormSubmit = 
    function ( form, service, formdata, targetUrl, successHandler, dataHandler, errorHandler, returnformat, type ){
    // cleanup
    var override = null;

    if ( type !== "" && type !== "post" ){
        override = type;
        type = "get";
    }

    ... inside AJAX Successhandler
    dataHandler == "yes" ? successHandler( objResponse, override ) : successHandler( override )

したがって、get/post が渡された場合、override は null になります。うまくいくようです。

4

1 に答える 1

1

ajax 呼び出しは非同期であるgetItemsため、データが返されるずっと前に関数の実行が終了します。できることの 1 つは、呼び出しにコールバック引数を追加し、ajax が成功したときにそれを呼び出すことです。何かのようなもの:

getItems: function(cbk)
//(...)
    successHandler = function(objResponse) {
        // here is the objResponse I need to pass back
        cbk(ojbResponse);
    };

dynoDataただし、コールバックを追加するように呼び出しを変更する必要がありgetItemsます。これにより、新しいオブジェクトのセットアップが完了します。

もう 1 つの解決策は、ajax 呼び出しを同期化することですが、これにより、データが返されるまでブラウザーが停止し、システムが応答しなくなります。

于 2012-12-10T22:31:19.780 に答える