1

私はこれをグーグルで試しましたが、それを再び愛することができませんでした。他の人にとっては本当に単純な問題のように思えるかもしれませんが、私はそれに困惑しています。以下のコードでは、最初のアラートで未定義になっていますが、2番目のアラートでも正しい値を取得しています。しかし、最初のアラート(アラートのある行だけ)をコメントアウトすると、2番目のアラート出力は未定義になります。これがなぜであるか、そして最初のアラートなしで2番目のアラートを正しく出力する方法を誰かが説明できますか?ヘルプをいただければ幸いです。

function getDetails(ID){
        var qArray = [];
        $.get('get_Question', {"Id":ID}, function(){})
        .success(function(data){
            var json = $.parseJSON(data);
            qArray.push(json.value1);
            qArray.push(json.value2);

        });
        //First Alert
        alert("-> "+qArray[0]);
        return qArray;
     }

これは、上記のメソッドを呼び出す2番目のアラートです。

var myArray = getDetails(4);
alert("myArray [0]: "+myArray[0]);
4

7 に答える 7

9

値を返すことはできません。$.get()呼び出しは非同期です。

qArrayAJAX呼び出しが完了するまで、つまりコールバック内で、操作を延期する必要があります。

さらに良いことに、遅延コールバックを使用します。

function getDetails(ID) {
    return $.get('get_Question', {"Id":ID})
            .pipe(function(json) {
               return [json.value1, json.value2];
             });
}

据え置き関数は、.pipe最終的に目的の配列を返す新しいpromiseを作成しますが、AJAX呼び出しが完了した場合に限ります。

次に、次のように使用します。

getDetails(ID).done(function(qArray) {
     alert("-> " + qArray[0]);
});

エラーコールバックを直接サポートしていないことに注意してください$.get()。ただし、遅延オブジェクトを使用すると、それらにアクセスできます。

getDetails(ID).done(function(qArray) {
     alert("-> " + qArray[0]);
}).fail(function(jqXHR, textStatus, errorThrown)) {
     alert("The AJAX request failed:" + errorThrown);
});

これがないと、エラー処理を関数に直接組み込むgetDetails()必要があり、その後、残りのアプリケーションロジックにエラーについて通知するためのメカニズムが必要になります。

注意:手動で呼び出す必要はないと思いJSON.parse()ます。Webサーバーが正しいContent-Typeヘッダーを返す場合、jQueryが自動的に呼び出します。

于 2013-01-03T11:54:25.943 に答える
4

Ajax呼び出しは非同期で発生します。つまり、呼び出しが戻って値を取得するのを待つことはできません。それを行う方法は、コールバックを採用することです。あなたの例はこれに似たものになります:

function getDetails(ID, callback){
    $.get('get_Question', {"Id":ID}, function(){})
    .success(function(data){
        var qArray = [];
        var json = $.parseJSON(data);
        qArray.push(json.value1);
        qArray.push(json.value2);
        callback(qArray)
    });
 }

それを呼び出すと少し変わります:

getDetails(4, function (myArray) {
    alert("myArray [0]: "+myArray[0]);
});
于 2013-01-03T11:55:18.087 に答える
2

最初のアラートはajax呼び出しが終了する前に呼び出されるため、変数はまだ定義されていません。これは、$。get()が非同期で実行されるためです。$ .get()が非同期呼び出しのパラメーターを渡すオプションがないため、代わりに$ .ajax()を使用してパラメーターを渡す必要がありますasync: false

于 2013-01-03T11:55:44.310 に答える
1

この$.get呼び出しにより、問題のリソースに対する新しい非同期リクエストが作成されます。

最初のアラートを呼び出すときはundefined、リクエストがまだ完了していないためです。また、アラートで一時停止する必要があるため、リクエストはバックグラウンドで完了する時間があります。2番目のアラートで利用できるようになるのに十分な時間。

最初のアラートをコメントアウトするときにも同じことが起こります。今回は、リクエストが完了して値が。になる前に2番目のアラートが呼び出されますundefined

で定義済みのコールバック関数内でコールバック関数を使用して、要求を行うかsynchronous、応答を受信した後に実行を継続することを検討する必要があります。success$.get

于 2013-01-03T11:57:25.123 に答える
1

他のいくつかが言っているように、ajax-requestは非同期です。ただし、同期要求を取得するようにasyncプロパティを設定することはできます。false

例:

function getDetails(ID) {
   var result = $.ajax('get_Question', { 
      async : false, 
      data : { 'Id' :  ID }
   });

   // do something with the result

   return result;
}

私自身は代わりにコールバック関数を使用していました。なぜなら、これasync:falseは悪い習慣であり、非推奨でもあるからです。

于 2013-01-03T12:05:35.353 に答える
0

$.get使用$.ajaxして指定するには、書き直す必要がありますasync: false

于 2013-01-03T11:54:12.237 に答える
0

AJAXは非同期です。リクエストがいつ完了するかはわかりません。これは通常、リクエストの完了時にリクエストの結果とともに呼び出されるコールバックメソッドを渡す必要があることを意味します。あなたの場合、これは次のようになります。

function getDetails(ID, callbackFunc){
    $.get('get_Question', {"Id":ID}, function(){})
    .success(function(data){
        var qArray = [];
        var json = $.parseJSON(data);
        qArray.push(json.value1);
        qArray.push(json.value2);
        callbackFunc(qarray);
    });
 }

 getDetails(4, function(qArray) {
     alert("myArray [0]: "+qArray[0]);
 };
于 2013-01-03T12:00:06.350 に答える