2013-02-12 1 views
5

Sto costruendo una web app che ha un insieme di funzioni che l'utente può eseguire alcune volte ma coinvolge abbastanza azioni asincrone per i callback da risultare un po 'fuori mano.Jquery promette: esiste un'alternativa riutilizzabile?

Quali sono alternative realistiche a $.Deffered e $.when che possono essere "utilizzate" più volte?

  • Io non sto cercando un quadro in piena regola
  • Non voglio usare callback (direttamente)

Grazie!

+0

1) non c'è bisogno di usare il resto della jQuery; può essere configurato in modalità "nessun conflitto"; 2) in quale altro modo si sarebbero differiti .. i callback .. essere implementati in JavaScript? –

+0

l'intero punto della programmazione Async consiste nell'avere callback per notificare al client che l'azione avviata è ora completata senza bloccare il thread. Se non si desidera notificare il client, è possibile ignorare la richiamata e non fare nulla. – Asdfg

+2

Non capisco cosa significhi "usato più volte". – Pointy

risposta

1

Qui ci sono 3 tali librerie:

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

Queste librerie non sono "in piena regola". Attuano solo promesse.

+0

Da RSVP.js "Una volta che una promessa è stata risolta o rifiutata, non può essere risolta o rifiutata di nuovo." ? – Haroldo

+0

@ Haroldo - Certo. Ecco come è [definito nelle specifiche] (http: //promises-aplus.github.com/promises-spec/# promise_states) (3.1.2.1. e 3.1.3.1), ed è così che funziona il sistema di jQuery. – MegaHit

+1

Ok forse la mia domanda non era abbastanza chiara, sto cercando un * alternatve * per promesse non librerie che offrono funzionalità promettenti ... – Haroldo

0

Invece di attaccare alla promessa direttamente, è possibile effettuare un wrapper la promessa che consente a un callback di sottoscrivere una promessa ricorrente o chiamata Ajax fatto a intervalli regolari:

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

Penso che quello che stai cercando sono eventi. Un esempio in jQuery utilizzando on e 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); 

uscita:

Handler 1: 1 
Handler 2: 1 
Handler 1: 2 
Handler 2: 2