4

functionA() と functionB() の 2 つの関数があり、それぞれに $.getJSON が含まれています。また、functionA() から返されるデータに応じて、functionB() は異なる動作をします。私は使用していました:

functionA();
functionB();

ただし、この設定では、functionB() から予期しない結果が得られることがありました。私の考えでは、functionA() の JSON 呼び出しが完了していなくても、functionB() の JSON 呼び出しが開始されていました。これに対する私の解決策は、functionB() を $.getJSON の ".done" 内に配置することでした。そして、これは機能しますが、 functionA() と functionB() をチェーンするよりエレガントな方法があるかどうか疑問に思っていました。 functionA() の外にあります。

4

3 に答える 3

4

構文を使用することをお勧めします(たとえば、callbackよく知られています):node.js

functionA(functionB);

関数はcallback引数を取りますが、次のようになります。

functionA(callback){
  // do stuff

  // when ready, run:
  return callback();
};

呼び出しがより複雑になっている場合は、ライブラリを確認することをお勧めしますasync

于 2013-06-08T23:01:02.677 に答える
1

これを実現するにはいくつかの方法があります。functionB() が実行される前に、functionA() の JSON 呼び出しが終了するのを待つ必要があることは明らかです。これを行う 1 つの方法は、functionA() の JSON 呼び出しの success() ハンドラー内から functionB() を呼び出すことです。次に例を示します。

function functionA() {
    $.getJSON(url, data, function(result) {
        // do something
        functionB();
    });
}

function functionB() {
    // do something
}

functionA();

functionA 内に functionB をハードコーディングしたくない場合は、それを引数として渡して、そのように呼び出すこともできます。次に例を示します。

function functionA(callback) {
    $.getJSON(url, data, function(result) {
        // do something
        callback();
    });
}

function functionB() {
    // do something
}

functionA(functionB);

もう 1 つのより洗練されたスケーラブルなソリューションは、functionA() の JSON 呼び出しが完了したときにカスタム イベントをトリガーし、その特定のイベント用の新しいイベント ハンドラーを作成してから functionB をトリガーすることです。このようにして、functionA と functionB は完全に分離されたままになり、お互いを知る必要はありませんが、適切な実行順序を確保することができます。ここで、カスタム イベントのトリガーとキャッチについて読むことができます: JQuery.trigger

于 2013-06-08T23:06:06.777 に答える
0

$.getJSONは非同期呼び出しであるため、同期 AJAX 要求を使用しない限り、 の $.getJSON の functionB()コールバックで呼び出す必要があります。同期リクエストを使用するには、$.getjson の代わりにカスタム リクエストを使用して変数を falseに設定する必要があります。ajax オプションについては、jQuery.ajax() のドキュメントを参照してください。jQuery.getJSon() ドキュメントは、json 用に ajax を構成する方法の例を示しています。functionA()

async$.ajax

于 2013-06-08T23:06:47.857 に答える