9
loadInfo: function(){
    var jsonCounter = 0,
    room = ['room1','room2','room3'],
    dates = [],
    prices = []

    $.each(booking.rooms, function(key, room_name) {
        $.getJSON('/get_info.php?room='+room_name, function(data) {
            dates[room_name] = data
            jsonCounter++
        })
        $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) {
            prices[room_name] = data
            jsonCounter++
        })

    })

    function checkIfReady() {
        if (jsonCounter === rooms.length * 2) {
            clearInterval(timer)
            run_the_rest_of_the_app()
        }
    }

    var timer = setInterval(checkIfReady, 100)

}

(クラスなどの一部なので、大幅に変更)

現時点では、タイマーの使用法がゴミのように見えるため、これは少しハックな気がします。$.when と $.done を使用しますが、部屋がいくつあるかわからないので、いつ何を入れればよいかわかりません。

run_the_rest_of_the_app() がすべての AJAX リクエストが戻ってきたときにのみ呼び出されるようにするにはどうすればよいですか?

4

2 に答える 2

19
  • var activeAJAX = 0;

  • AJAX呼び出しを行う前に、activeAJAX++;

  • (コールバックで)AJAX呼び出しを完了した後:if (--activeAJAX == 0) { allDone(); }

于 2012-04-09T15:29:56.533 に答える
4

when/done の使用方法は次のとおりです。

loadInfo: function(){
    var room = ['room1','room2','room3'],
    dates = [],
    prices = [],
    requests = [];

    $.each(booking.rooms, function(key, room_name) {
        var aRequest;

        aRequest = $.getJSON('/get_info.php?room='+room_name, function(data) {
            dates[room_name] = data;
        });
        requests.push(aRequest);

        aRequest = $.getJSON('/get_info.php?room='+room_name+'&prices', function(data) {
            prices[room_name] = data;
        });
        requests.push(aRequest);

    })

    $.when.apply($, requests).done(run_the_rest_of_the_app);
}
于 2012-04-09T15:37:33.340 に答える