103

私はこのようなものを探しています

function someFunc() {

callAjaxfunc(); //may have multiple ajax calls in this function
someWait(); // some code which waits until async calls complete
console.log('Pass2');

}

function callAjaxfunc() {
  //All ajax calls called here
  console.log('Pass1');

}

私が試したことは何ですか?

1 Jquery.when()

それを使用してみました..それは正常に動作します. しかし、私が望む方法ではありません。$.when待機しますが、次のコードは待機せずに$.when()実行されます。内部のコードdo callbackは ajax 呼び出し後にのみ実行されます

2. グローバル フラグを指定した setTimeOut()

これはうまくいくと確信しました。以下のようにしてみました。

GlobalFlag = false;

function someFunc()     
    callAjaxfunc(); //may have multiple ajax calls in this function
    setTimeOut(waitFunc, 100); // some  which waits until async calls complete
    console.log('Pass2');
}

function callAjaxfunc() {
    //All ajax calls called here
    onAjaxSuccess: function() {
        GlobalFlag = true;
    };
    console.log('Pass1');    
}

function waitFunc() {
    if (!GlobalFlag) {
        setTimeOut(waitFunc, 100);
    }
}​

まだ望んでいた結果を得ることができません。ここで何か間違ったことをしていますか?これは方法ではありませんか?

私が望んでいた結果はこのようになるはずです

Pass1
Pass2

AJAX呼び出しが必要なため、フィドルを作成できません

編集:多くの人がコールバックを提案していたように..私はそれらについて知っています..しかし、それでも次のコードが実行されます...ブラウザがajax呼び出しまでsomewait()次のコードの実行を完全に停止するようにしたい..また、それは悪い習慣かもしれませんsomewait()しかし、可能であれば知って試してみる価値があります...

4

4 に答える 4

61

コールバックを使用します。このようなものは、サンプル コードに基づいて動作するはずです。

function someFunc() {

callAjaxfunc(function() {
    console.log('Pass2');
});

}

function callAjaxfunc(callback) {
    //All ajax calls called here
    onAjaxSuccess: function() {
        callback();
    };
    console.log('Pass1');    
}

これはPass1すぐに出力され (ajax リクエストに少なくとも数マイクロ秒かかると仮定)、実行Pass2時に出力onAjaxSuccessされます。

于 2012-12-25T14:31:25.873 に答える
20

を使用してもうまくいかなかったのはなぜDeferred Objectsですか? 私が何かを誤解していない限り、これはあなたのために働くかもしれません.

/* AJAX success handler */
var echo = function() {
    console.log('Pass1');
};

var pass = function() {
  $.when(
    /* AJAX requests */
    $.post("/echo/json/", { delay: 1 }, echo),
    $.post("/echo/json/", { delay: 2 }, echo),
    $.post("/echo/json/", { delay: 3 }, echo)
  ).then(function() {
    /* Run after all AJAX */
    console.log('Pass2');
  });
};​

こちら を参照してください


アップデート

あなたの入力に基づいて、同期リクエストを使用するのが最も簡単な代替手段のようです。リクエストでプロパティasyncfalseに設定して、$.ajaxリクエストをブロックすることができます。ただし、これにより、リクエストが完了するまでブラウザがハングします。

これはお勧めしませんが、イベントベースのワークフローに依存しないようにコードを修正する必要があると考えています。

于 2012-12-25T14:37:33.037 に答える
8

本物のプログラマーはセマフォを使ってそれを行います。

変数を に設定し0ます。各 AJAX 呼び出しの前にインクリメントします。各成功ハンドラーでそれを減らし、テストし0ます。そうであれば、完了です。

于 2012-12-25T14:24:07.370 に答える
0

ajax 呼び出しが完了するまで待機する必要がある場合は、呼び出しを同期的に行うだけで済みます。

于 2012-12-25T14:38:09.700 に答える