2012-07-12 13 views
15

Devo trovare un modo per aggiornare un'applicazione Web implementata con backbone.Richiesta di polling per l'aggiornamento dei modelli Backbone/Viste

Il caso di utilizzo sarà il seguente:
ho diverse viste, e ogni vista, o forse il modello/collezione relative a questo punto di vista, ha bisogno di fare diversi richiesta di polling al server in tempi diversi per scoprire qualche cambiamento .

Mi chiedo che cosa è il modo più generale:

1) implementare il Traditional Polling Request
2) implementare il Long Polling Request
3) attuare la HTML5 web socket


PS:
1) Il server è scritto in PHP.
2) Per ora sto cercando una soluzione senza usare WebSocket HTML5 perché forse con PHP non è così semplice.


Ecco il mio codice semplice (1) utilizzando Traditional Polling Request.

(1)

// MyModel 
var MyModel = Backbone.View.extend({ 
    urlRoot: 'backendUrl' 
}); 

// MyView 
var MyView = Backbone.View.extend({ 

    initialize: function() { 
     this.model = new MyModel(); 
     this.model.fetch(); 
     this.model.on('change', this.render); 
     setTimeout(function() { 
      this.model.fetch(); 
     }, 1000 * 60 * 2); // in order to update the view each two minutes 
    } 
}); 

+0

se si conosce asp.net è possibile controllare SignalR, rende molto semplice l'interazione client-server e sceglie automaticamente il modello di connessione appropriato in base alle funzionalità del browser – Alexander

+0

websocket in php. vecchio codice e chiamato un rapido hack dell'autore ... potrebbe ancora valere la pena dare un'occhiata. http://code.google.com/p/phpwebsocket/source/browse/#svn%2Ftrunk%2F%20phpwebsocket –

+0

websocket in php molto più promettente: http://code.google.com/p/phpws/source/ browse/# git% 2Fphpws –

risposta

18

implementarlo nel vostro modello del gestore di polling, controllare questo esempio:

// MyModel 
var MyModel = Backbone.Model.extend({ 
    urlRoot: 'backendUrl', 

    //Add this to your model: 
    longPolling : false, 
    intervalMinutes : 2, 
    initialize : function(){ 
    _.bindAll(this); 
    }, 
    startLongPolling : function(intervalMinutes){ 
    this.longPolling = true; 
    if(intervalMinutes){ 
     this.intervalMinutes = intervalMinutes; 
    } 
    this.executeLongPolling(); 
    }, 
    stopLongPolling : function(){ 
    this.longPolling = false; 
    }, 
    executeLongPolling : function(){ 
    this.fetch({success : this.onFetch}); 
    }, 
    onFetch : function() { 
    if(this.longPolling){ 
     setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes 
    } 
    } 
}); 

// MyView 
var MyView = Backbone.View.extend({ 

    initialize: function() { 
     this.model = new MyModel(); 
     this.model.startLongPolling(); 
     this.model.on('change', this.render); 
    } 
}); 
+0

L'ambito è ambiguo anche in caso di binding this.model.on ('change', this.render); // Ambito ambiguo: il mio caso era lo scope dei modelli this.model.on ('change', this.render, this); // Campo di validità – hharnisc

+0

@hharnisc non è ambiguo perché l'ho usato per inizializzare "_.bindAll (this);" –

+0

Si tratta di un sondaggio a lungo termine o stai semplicemente usando quella parola? La mia comprensione è che, nel lungo polling, si apre una singola connessione al server e si attende una risposta. Questo sembra che tu stia sondando continuamente. – Ziggy

11

io non sono sicuro di quello che stai chiedendo qui, ma ecco alcune riflessioni:

1) Il tuo codice sembra contraddire quello che hai scritto nel titolo. L'utilizzo di setTimeout (o setInterval) per il polling continuo è qualcosa di diverso dal polling lungo. In realtà è un (normale) sondaggio. La differenza è che con il client di polling lungo si avvia una richiesta AJAX e lui attende. Il server decide quando rispondere. E dovrebbe rispondere solo quando sono disponibili nuovi dati. E immediatamente dopo che il client di risposta inizia una nuova richiesta di polling.

Nota a margine: creare un server di polling lungo (relativamente) efficiente non è un compito facile, tenetene conto.

2) Il modo in cui gestisci il lato client (vale a dire dove si inserisce una logica di polling lunga) non è importante purché si sappia cosa succede nel codice. Naturalmente tieni presente che forse in futuro ti piacerebbe apportare alcune modifiche al codice, quindi tenerlo separato sarebbe probabilmente la scelta migliore. Ecco l'architettura che sceglierei:

  • Script indipendente che crea l'oggetto globale EventManager (questo script dovrebbe caricarsi come il primo). Tale oggetto avrà i seguenti metodi: .bind e .trigger e, erm ... gestirà gli eventi. :) Ecco per esempio come l'implementazione può apparire come:

Implementing events in my own object

  • sceneggiatura indipendente che si occupa di polling lungo. Ogni volta che i dati vengono ricevuti dal server (ad es.la richiesta di polling lungo AJAX termina) chiama EventManager.trigger('long_polling_data', res);. Quindi devi associare a questo evento nella tua vista backbone o ovunque desideri.

Nota a margine: bonus supplementare con questa architettura è che se si decide di passare a WebSockets o qualsiasi altra tecnica (ad esempio: JSONP polling), allora si avrà solo a implementare la logica per l'altra tecnica. Il codice principale utilizzerà solo l'evento long_polling_data, quindi non saranno necessarie ulteriori modifiche (potresti voler cambiare il nome dell'evento:]).

3) Anche se si dice che non si desidera utilizzare WebSockets, devo commentare su questo. :) Sai che il mondo è in continua evoluzione. Dovresti dimenticare le lunghe tecniche di sondaggio. L'utilizzo di WebSockets e XMLSocket (a.k.a. FlashSocket) come fallback è molto più efficiente ed è molto più semplice implementare il lato server.

Spero di aver contribuito un po ', mi dispiace per eventuali errori di lingua e buona fortuna con il tuo progetto!

+1

grazie per la risposta. Ho cambiato il titolo della mia domanda da Long Polling a Polling tradizionale. –

+0

Ho aggiunto ulteriori dettagli sulla mia domanda. forse può aiutarti a darmi maggiori informazioni su come posso usare webSocket. Grazie. –

+0

Siamo spiacenti, non sono uno sviluppatore PHP e non posso aiutarti in questo. A meno che non vogliate imparare Python o Server Side JavaScript. :] Quando ci penso ora, potrebbe essere un po 'difficile per uno sviluppatore inesperto implementare lunghi polling e/o websocket. Se non farai molte richieste, allora anche il polling normale dovrebbe funzionare. E questo è molto semplice da implementare, basta usare 'setTimeout'. – freakish

2

So che indicare nella sua domanda che non si sta cercando di utilizzare WebSockets con PHP (a causa, essendo non è così semplice) tuttavia, ho trovato che sia relativamente semplice.

  1. Ho utilizzato http://pusher.com/ che è un'app di socket Web con fallback. (A proposito, non sono collegato alla compagnia).
  2. include https://github.com/squeeks/Pusher-PHP sul server/api
  3. include <script src="http://js.pusherapp.com/1.12/pusher.min.js"></script> sul lato client.

Il canale client e server può essere configurato per parlare tra loro tramite prese Web.

+0

Grazie per la risposta. il pusher-php sembra molto interessante. –

+0

il pusher-php sembra molto interessante ma devo pagarlo !! –