0

私はこれで一種の初心者なので、許してください:)

変数を更新する関数のこの部分を取得できません。誰かが私が間違っていることを見てみることができますか?

http://pastie.org/private/zfnv8v2astglabluo89ta

142 行目から 172 行目まで、最終的に結果が得られません。その関数内でテストして、実際にデータが返されることを確認しましたが、「body」変数は 172 行目以降に戻っています。そのため、ページで生成された HTML を見ると、関数が 140 からスキップしているように見えます。 174に。

フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

2

あなた$.getは非同期です。つまり、コードの残りの部分の後で終了するため、その関数内の body 変数への影響はわかりません。代わりに、成功のコールバック関数は、この関数が既に終了してからかなり後に呼び出されます。

ここにあるように複数の非同期 ajax 呼び出しをチェーンするには、非同期 ajax 呼び出しはシーケンシャルではないため、通常のシーケンシャル プログラミングを使用することはできません。ネットワーク リクエストが送信されると、JavaScript が実行を継続し、しばらくしてレスポンスが到着すると、成功ハンドラが呼び出されて実行されます。

あなたが持っているように連続した ajax 呼び出しを実行するには、成功ハンドラー内で作業をネストして、応答を使用する唯一のコードが実際に成功ハンドラーにあるようにする必要があります。擬似コードでは、次のようになります。

$.get(..., function(data) {
    // operate on the results only in here

    // a second ajax function that uses the data from the first 
    // or adds onto the data from the first
    $.get(..., function(data) {
        // now finally, you have all the data 
        // so you can continue on with your logic here

    });
    // DO NOT PUT ANYTHING HERE that uses the responses from the ajax calls 
    // because that data will not yet be available here
});

次のようなことを行うことはできません。

var myVariable;

$.get(..., function(data) {
    // add something to myVariable
});
$.get(..., function(data) {
    // add something to myVariable
});
$.get(..., function(data) {
    // add something to myVariable
});
// do something with myVariable

これらの ajax 呼び出しは、関数の終了前に完了していません。最初の例のようなデザイン パターンに従う必要があります。

より高度なツールの場合、ajax 呼び出しが完了した後に実行するコードを定義する別の方法であるjQuery deferredをいつでも使用できます。最初のコード例と同じようにコードを実行するようにスケジューリングしているだけですが、これはシーケンシャル プログラミングに少し似ています。

于 2012-07-20T07:21:23.680 に答える
0

関数 8 は、174 ~ 180 行目の後で呼び出されます。174 ~ 180 行から関数の最後までのコードを配置する必要があります

于 2012-07-20T07:22:54.917 に答える