Powiedzmy, że robię 3 połączenia Ajax i chcę czekać na 3 połączenia, aby zakończyć przed wykonaniem czegoś.

Czy istnieje tam biblioteka, aby synchronizować wiele zdarzeń asynchronicznych w JavaScript? (Korzystanie z systemu zdarzeń lub nie jQuery)

Dawny.:

var sync = new syncLib();
$('a1').click(sync.newListener());
$('a2').click(sync.newListener());

sync.wait(function(e1, e2) {
  // fired when both a1 and a2 are clicked or when 10 seconds have passed
  // e1 and e2 would have properties to know whether or not they timed out or not..
}, 10 /* timeout */));

Znalazłem to: https://github.com/ovea/js -SYNC / BLOB / MASTER / Readme.md, ale limity czasu nie są obsługiwane. (Powiedzmy, że drugi telefon Ajax zajmuje się zbyt długo, nie chcę, żeby moja synchronizacja była odświeżona, chcę ustawić limit czasu 10 sekund

Wiem, że mogę się coś kodować, ale po prostu sprawdzam tutaj (po Googlingu za to)

Dzięki!

Edytuj: Od tego czasu znalazłem asynchent: https://github.com/Caolan/async

4
Mike Gleason jr Couturier 14 grudzień 2011, 23:24

4 odpowiedzi

Najlepsza odpowiedź
$.when($.ajax("/"), $.ajax("/"), $.ajax("/")).then(function () {
    alert("all 3 requests complete");
});

Dokumentacja

11
Esailija 14 grudzień 2011, 19:28

Możesz użyć jQuery Odroczony obiekt

Oto przydatny post http://www.erichynds.com/jquery/using -Deferreds-in-jquery /

3
Rafay 14 grudzień 2011, 19:29

Rozwiązanie .deferred .when Po prostu ustawiłeś licznik na ile połączeń ajax masz w locie i w obsłudze sukcesu dla każdego połączenia AJAX, zmniejszasz licznik i strzelać do swojej akcji, gdy licznik dotrze do zera.

function DoMyAjaxCalls(callbackWhenDone) {
    var numAjaxCalls = 3;

    // set timeout so we don't wait more than 10 seconds to fire the callback
    // even if ajax calls aren't done yet
    var timer = setTimeout(callbackWhenDone, 10*1000);

    function checkAjaxDone() {
        --numAjaxCalls;
        if (numAjaxCalls == 0) {
            clearTimeout(timer);
            callbackWhenDone();
        }
    }

    // first ajax call
    $.ajax({
        url: 'ajax/test1.html',
        success: function(data) {
            // write code to handle the success function
            checkAjaxDone();
        },
        error: checkAjaxDone
    });

    // second ajax call
    $.ajax({
        url: 'ajax/test2.html',
        success: function(data) {
            // write code to handle the success function
            checkAjaxDone();
        },
        error: checkAjaxDone
    });

    // third ajax call
    $.ajax({
        url: 'ajax/test3.html',
        success: function(data) {
            // write code to handle the success function
            checkAjaxDone();
        },
        error: checkAjaxDone
    });
}
1
jfriend00 14 grudzień 2011, 19:46

Tutaj masz [Biblioteka] [1] na podstawie jQuery wykonane w tym celu.

W prostych przypadkach, $.when() jest najlepszy, ale jcon-q-rency umożliwia synchronizację dowolnych sekcji kodu asynchronicznego.

http://www.megiddo.ch/jcon-irency.

1
MaParole 22 grudzień 2016, 05:03