2011-06-25 26 views
27

¿Hay alguna manera de tener una solicitud AJAX con múltiples respuestas?Respuesta múltiple Solicitud AJAX

Por ejemplo, si realizo una solicitud GET al servidor que llevará mucho tiempo calcular, ¿cómo podría hacer que el servidor ocasionalmente envíe respuestas que me den algunos datos sobre el progreso?

Si es así, ¿alguien podría publicar un ejemplo, preferiblemente con Jquery y una explicación del mecanismo a través del cual el servidor puede hacerlo?

+0

¿Qué idioma/marco del servidor está utilizando? –

+3

No importa, porque es imposible – genesis

+0

@The Scrum Meister C#/ASP.NET –

Respuesta

20

se puede implementar esta utilizando 2 llamadas ajax, uno para ejecutar el proceso y una segunda llamada a sondear periódicamente el progreso:

en el lado del servidor:

public class ProgressInfo 
{ 
    public int Percent {get;set;} 
    public bool Done {get;set;} 
} 

public JsonResult DoCalculation(string id) 
{ 
    ProgressInfo progress = new ProgressInfo(); 
    if(!string.IsNullOrEmpty(id)) 
    { 
     Session[id] = progress; 
    } 

    //periodicly update progress 
    progress.Percent++; 
} 

public JsonResult GetProgress(string id) 
{ 
    ProgressInfo progress; 
    if(string.IsNullOrEmpty(id) 
     || (progress = Session[id] as ProgressInfo) == null) 
    { 
     return Json(new { 
      success = false 
     }); 
    } 
    if(progress.done) 
    { 
     Session.Remove(id); 
    } 
    return Json(new { 
     success = true, 
     done = progress.done, 
     percent = progress.Percent 
    }); 
} 

En el lado del cliente:

var progressID = Math.random(); 

function doCalculation() { 
    $.post('<%=Url.Action("DoCalcluation")%>/' + progressID); 
    setTimeout(pollProgress, 1000); 
} 

function pollProgress() { 
    $.post('<%=Url.Action("GetProgress")%>/' + progressID, function(response){ 
     if(!response.success) { 
      alert('Cannot find progress'); 
      return; 
     } 
      if(response.done) { 
       alert('Done!'); 
      } else { 
      alert('Progress at ' + response.precent + '%'); 
      setTimeout(pollProgress, 1000 /*1 second*/); 
      } 
    }, 'json'); 
} 
+0

¡Listo, me gusta! No había pensado en usar la sesión para almacenar los datos de progreso. –

+0

@ peter-of-the-corn Hay otras maneras de hacerlo. Mire en [Comet] (http://en.wikipedia.org/wiki/Comet_ (programación)). Si usa esta solución, asegúrese de validar el parámetro 'id' para que un usuario malintencionado no pueda sobrescribir la sesión completa. –

5

Respuesta rápida: No, no es posible.

usted debe enviar más solicitudes para obtener más respuestas

+0

Pero el código tendría que reiniciarse al principio si enviaba otra solicitud. :( –

+0

reiniciar? ¿Qué significa? – genesis

+1

Reiniciar significa volver a empezar o hacerlo de nuevo –

1

Lo más probable es necesario la ayuda de la codificación del lado del servidor, porque parece que se necesitan ajax o lo que también se llama empuje cometa inversa. No sé qué idioma utiliza en el lado del servidor, pero la idea básica es retrasar la respuesta http mientras el navegador permita el uso de bucle infinito (en el lado del servidor) y datos push mientras la conexión está activa

Es posible que desee mira esto: http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ

+0

¿QUIERES DEJAR SALTAR DATOS DE BÚSQUEDA ANTES DE ESCRITURA? termina?Buena idea, pero muy complicada y requiere una buena configuración de apache/php – genesis

+0

sí, puede ser complicado si codifica sus propios manejadores para esto, pero a gran escala hay productos como WebSync para manejar el servidor push. – vlscanner

1

Tenga una mirada en xajax puede enviar múltiples respuestas de vuelta, y una vez ellos pueden redirigir a ciertas áreas. En este sentido, xajax es mucho mejor que jQuery. Puedo hacer una solicitud y el servidor puede redactar una respuesta que contenga respuestas múltiples, ya sea HTML, JavaScript, llamadas, etc. Incluso puede decir que ponga esto allí y allí con opciones como agregar, reemplazar, etc. muy bien. jQuery debería hacer esto, entonces puedo cambiar de una vez por todas a jQuery ... Esto es lo único que me está impidiendo cambiarme.

+0

XAJAX es solo para PHP, y solo transfiere datos con XML. –

0

One Ajax request -----------> Obtienes una respuesta.

Lo que realmente puede hacer es.

compruebe los datos de respuesta y hagan la acción DIFERENTE según los datos obtenidos.

Cuestiones relacionadas