2012-07-12 13 views
15

Necesito encontrar una manera de actualizar una aplicación web implementada con backbone.Solicitud de sondeo para actualizar Backbone Models/Views

El caso de uso será el siguiente:
Tengo varias vistas, y cada vista, o tal vez el modelo/colección relacionada con este punto de vista, necesita hacer diferente petición de consulta al servidor en un momento diferente para descubrir algún cambio .

Me pregunto ¿cuál es la forma más general de:

1) implementar el Traditional Polling Request
2) implementar el Long Polling Request
3) implementar el HTML5 web socket


PS:
1) El servidor está escrito en PHP.
2) Por ahora estoy buscando una solución sin usar WebSockets HTML5 porque tal vez con PHP no es tan simple.


Aquí está mi código simple (1) usando 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

si conoces asp.net puedes buscar en SignalR, hace que la interacción entre el cliente y el servidor sea muy fácil y elige el modelo de conexión apropiado automáticamente según las capacidades del navegador – Alexander

+0

websocket en php. viejo código y llamado truco rápido por el autor ... todavía puede valer la pena mirar. http://code.google.com/p/phpwebsocket/source/browse/#svn%2Ftrunk%2F%20phpwebsocket –

+0

websocket en php mucho más prometedor: http://code.google.com/p/phpws/source/ browse/# git% 2Fphpws –

Respuesta

18

implementarlo en su modelo el manejador de votación, comprobar este ejemplo:

// 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

El alcance es ambiguo en incluso vincular this.model.on ('change', this.render); // Alcance ambiguo: mi caso fue el alcance de los modelos this.model.on ('change', this.render, this); // Alcance de vista – hharnisc

+0

@hharnisc no es ambiguo porque lo usé al inicializar "_.bindAll (this);" –

+0

¿Realmente es una encuesta larga, o simplemente estás usando esa palabra? Según tengo entendido, en las encuestas largas abre una única conexión con el servidor y espera una respuesta. Parece que estás sondeando continuamente. – Ziggy

11

no estoy seguro de lo que están pidiendo aquí, pero aquí hay algunas ideas:

1) Su código parece contradecir lo que has escrito en el título. Usar setTimeout (o setInterval) para un sondeo continuo es algo diferente a un sondeo largo. En realidad, es un sondeo (normal). La diferencia es que con un largo sondeo, el cliente inicia una solicitud AJAX y espera. El servidor decide cuándo responder. Y debe responder solo cuando hay nuevos datos disponibles. E inmediatamente después de que el cliente responda comienza una nueva solicitud de sondeo.

Nota al margen: la creación (relativamente) eficiente del servidor de sondeo largo no es una tarea fácil, tenga en cuenta eso.

2) Cómo manejas el lado del cliente (es decir, dónde pones una larga lógica de sondeo) realmente no importa siempre que sepas qué está sucediendo dentro de tu código. Por supuesto, tenga en cuenta que tal vez en un futuro le gustaría hacer algunos cambios en el código, por lo que mantenerlo separado probablemente sería una mejor opción. Esta es la arquitectura que yo elegiría:

  • escritura independiente que crea objeto global EventManager (este script debe cargar como el primero). Tal objeto tendrá los siguientes métodos: .bind y .trigger y lo hará, erm ... gestionar eventos. :) Aquí está, por ejemplo, cómo la implementación puede verse como:

Implementing events in my own object

  • escritura independiente que se ocupa de sondeo largo. Cuando los datos se reciben del servidor (es decirla solicitud de larga duración de AJAX finalmente finaliza) llama al EventManager.trigger('long_polling_data', res);. Luego debe vincularse a este evento dentro de su vista de red troncal o donde desee.

Nota al margen: bono adicional con esta arquitectura es que si usted decide cambiar a WebSockets o cualquier otra técnica (por ejemplo: JSONP sondeo), después, sólo tendrá que aplicar la lógica para la otra técnica. El código principal solo usará el evento long_polling_data, por lo que no se requerirán cambios adicionales (es posible que desee cambiar el nombre del evento:]).

3) Aunque diga que no desea utilizar WebSockets, tengo que comentar esto. :) Sabes que el mundo está en constante evolución. Deberías olvidarte de las largas técnicas de votación1. Usar WebSockets y XMLSocket (a.k.a. FlashSocket) como respaldo es mucho más eficiente y es mucho más simple implementar el lado del servidor.

¡Espero haber ayudado un poco, disculpe los errores de lenguaje y buena suerte con su proyecto!

+1

gracias por su respuesta. Cambié el título de mi pregunta de Long Polling a Traditional Polling. –

+0

Agregué más detalles sobre mi pregunta. Tal vez pueda ayudarlo a darme más información sobre cómo puedo usar webSocket. Gracias. –

+0

Lo siento, no soy un desarrollador de PHP y no puedo ayudarte con eso. A menos que esté dispuesto a aprender Python o JavaScript del lado del servidor. :] Cuando lo pienso ahora, puede ser un poco difícil para un desarrollador sin experiencia implementar encuestas largas y/o websockets. Si no va a hacer muchas solicitudes, entonces las encuestas normales deberían funcionar también. Y esto es realmente simple de implementar, solo usas 'setTimeout'. – freakish

2

Sé que usted indica en su pregunta que no está mirando para utilizar websockets con PHP (debido a que es no tan simple) Sin embargo, he descubierto que es relativamente sencillo.

  1. He usado http://pusher.com/ que es una aplicación de sockets web con retrocesos. (Por cierto, no estoy conectado con la compañía).
  2. incluyen https://github.com/squeeks/Pusher-PHP en el servidor/api
  3. incluyen <script src="http://js.pusherapp.com/1.12/pusher.min.js"></script> en el lado del cliente.

El cliente y el canal del servidor se pueden configurar para que hablen entre sí mediante sockets web.

+0

Gracias por su respuesta. el empujador-php parece muy interesante. –

+0

¡el empujador-php parece muy interesante pero tengo que pagarlo! –

Cuestiones relacionadas