0

以下の私の関数はAJAX呼び出しを行い、無効なJSONオブジェクトが返されたため、結果を有効なJSONオブジェクトに手動で解析する必要があります(これは機能します)。問題は、JSON オブジェクトを元の呼び出し関数に戻すときに、オブジェクトが正しく戻されないことです。

3 番目のアラートのみを入力すると、オブジェクトに対して「無効」と表示されます。ただし、3 つのアラートすべてを入力すると、アラート 2 のみが無効と表示されます (1 と 3 はオブジェクトを表示します)。これは、これらの変数間でオブジェクトを渡すタイミングの問題である可能性があると信じています。明らかに最終的なコードにアラートを入れることができないため、これを解決する方法に関する推奨事項。

    function loadDocuments(){
       var myDocuments = getDocs();
       alert('third response ' + myDocuments);
    }

    function getDocs() {            
            var myURL = "someURL";
            var response;
            $.ajax({
                url: myURL,
                type: 'GET',
                dataType: 'json',
                 complete: function(docData) {
                   if(docData.status==200){
                       response = parseDocResults(docData.responseText);
                       alert('first response' + response);                                                   
                   }else{
                       response = "Documents failed to load";
                   }
                }
            });
            alert('second response' + response);
         return response;
    } 
4

2 に答える 2

1

試した方法で AJAX を使用するということはsynchronous、転送が完了するまでブラウザをブロックするアプローチで使用することを意味します。に設定するとAJAXを同期させる機能のasync構成フラグを見つけることができますが、私はそれをお勧めしません(また、非推奨でもあります)。$.ajax()false

この$.ajax()関数は、HTTP 要求をサーバーに送信するだけです。すぐに返される応答を待たず、ajax 関数呼び出しの後の命令で実行が続行されます。

しばらくして、ブラウザー (JavaScript) がサーバーから HTTP 応答を受け取ります。ajax 関数呼び出しは、HTTP 応答を処理するために使用されるcomplete/コールバックを指定しました。successしかし、そのコールバックは「後で」実行されたため、戻り値に依存せずに、コールバック内からロジックを形成する必要があります。

于 2013-01-11T10:07:33.563 に答える
0

次のように実行できます。

var myDocuments;

getDocs(); //call getDocs() instead of loadDocuments() in your coding logic

function loadDocuments(response){
        myDocuments = response;
        alert(myDocuments);
    }

    function getDocs() {            
            var myURL = "someURL";
            var response;
            $.ajax({
                url: myURL,
                type: 'GET',
                dataType: 'json',
                 complete: function(docData) {
                   if(docData.status==200){
                       response = parseDocResults(docData.responseText);
                       alert('first response' + response);                                                   
                   }else{
                       response = "Documents failed to load";
                   }

                   loadDocuments(response);
                }
            });            
    } 
于 2013-01-11T10:11:56.810 に答える