2013-02-12 47 views
5

Buduję aplikację internetową, która ma zestaw funkcji, które użytkownik może wykonać kilka razy, ale zawierają wystarczającą liczbę asynchronicznych akcji dla wywołań zwrotnych, aby uzyskać nieco z ręki.Jquery obiecuje: Czy istnieje alternatywa wielokrotnego użytku?

Jakie są realistyczne alternatywy dla $.Deffered i $.when, które mogą być "używane" wiele razy?

  • ja nie szukam pełnowartościowy ramach
  • nie chcę używać wywołania zwrotne (bezpośrednio)

Dzięki!

+0

1) nie trzeba używać resztę jQuery; może być skonfigurowany w trybie "bez konfliktu"; 2) w jaki sposób inaczej odroczone .. callbacks .. zostać zaimplementowane w JavaScript? –

+0

Cały punkt programowania asynchronicznego polega na tym, aby wywołania zwrotne powiadamiały klienta, że ​​inicjowane działanie zostało zakończone bez blokowania wątku. Jeśli nie chcesz powiadamiać klienta, możesz zignorować wywołanie zwrotne i nic nie robić. – Asdfg

+2

Nie rozumiem, co oznacza "używane wiele razy". – Pointy

Odpowiedz

1

Oto 3 takie biblioteki:

  1. Q
  2. rsvp.js
  3. when.js

Biblioteki te nie są "pełnowartościowy". Po prostu realizują obietnice.

+0

Od RSVP.js "Gdy obietnica zostanie rozwiązana lub odrzucona, nie można jej ponownie rozstrzygnąć ani odrzucić." ? – Haroldo

+0

@Haroldo - Oczywiście. Tak to jest [zdefiniowane w specyfikacji] (http: //promises-aplus.github.com/promises-spec/# promise_states) (3.1.2.1 i 3.1.3.1), i tak działa system jQuery. – MegaHit

+1

Ok może moje pytanie nie było wystarczająco jasne, szukam * alternatve * do obietnic nie bibliotek, które oferują obiecującą funkcjonalność ... – Haroldo

0

Zamiast mocowania obietnicy bezpośrednio, można dokonać otoki wokół obietnicy, która umożliwia oddzwanianie do subskrypcji cyklicznego obietnicy lub Ajax połączenia wykonanego przy ustalonym przedziale:

var cycle = function(func, interval){ 
    var _this = this; 

    // Use jQuery's triggers to manage subscriptions 
    var o = $({}); 
    this.publish = o.trigger.bind(o); 
    this.subscribe = o.on.bind(o); 
    this.unsubscribe = o.off.bind(o); 

    var call = function(func){ 

     clearTimeout(_this.timeout); 

     func().done(function(response){ 
      _this.publish('ajax:update', response); 
      _this.timeout = setTimeout(function(){ 
       call(func); 
      }, interval); 
     }); 
    }; 
    call(func); 

    return this; 
}; 

var ajax_promise = function(){ 
    return $.getJSON('http://localhost/some/data.json'); 
}; 

var my_callback = function(response){ 
    // Do stuff 
}; 

cycle(ajax_promise, 10000).subscribe('ajax:update', my_callback); 
2

myślę co Cię Szukamy wydarzeń. Przykładem w jQuery przy użyciu on i trigger:

var data_handler = $({}); 

function get_data(new_foo) { 
    // Do stuff, then send the event 
    data_handler.trigger('new_data', {foo: new_foo}); 
} 

data_handler.on('new_data', function(e, data) { 
    console.log('Handler 1: ' + data.foo); 
}); 

data_handler.on('new_data', function(e, data) { 
    console.log('Handler 2: ' + data.foo); 
}); 

get_data(1); 
get_data(2); 

wyjściowa:

Handler 1: 1 
Handler 2: 1 
Handler 1: 2 
Handler 2: 2 
Powiązane problemy