Cualquier forma de imponer un límite de tiempo de espera con gracia al cargar un archivo externo lenta a través de JavaScript?

StackOverflow https://stackoverflow.com/questions/2021157

Pregunta

Estoy usando javascript para incluir algún contenido servido desde un archivo php en otro servidor. Sin embargo, este otro servicio a veces pueden ser escamosa y tomar un largo tiempo para cargar o no se carga en absoluto.

¿Hay una manera de JS para tratar de obtener los datos externos para x número de segundos antes de fallar y mostrar un mensaje "Por favor, inténtelo de nuevo"?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>
¿Fue útil?

Solución

Los problemas de la pareja: se puede utilizar umbrales de tiempo de espera con XMLHttpRequest (también conocido como Ajax), pero ya que está en una otherserver.com no se puede utilizar XMLHttpRequest (y apoyar a todos los navegadores de categoría A) debido a la política del mismo origen restricción .

Si el guión introduce ningún tipo de nombre global (por ejemplo, cualquier nombre de variable, nombre de la función, etc) Usted puede tratar setTimeout seguir buscando que:

var TIMELIMIT = 5; // seconds until timeout
var start = new Date;

setTimeout(function() {
  // check for something introduced by your external script.
  // A variable, namespace or function name here is adequate:
  var scriptIncluded = 'otherServerVariable' in window;

  if(!scriptIncluded) {
    if ((new Date - start) / 1000 >= TIMELIMIT) {
      // timed out
      alert("Please try again")
    }
    else {
      // keep waiting...
      setTimeout(arguments.callee, 100)
    }
  }
}, 100)

El problema que veo es que no se puede cancelar la solicitud de la secuencia de comandos. Por favor, que alguien me corrija si estoy equivocado, pero la eliminación de la <script> del DOM todavía a dejar la petición del navegador para el recurso activo. Por lo tanto, aunque se puede detectar que el guión está tardando más de x segundos para cargar, no se puede Cancelar la solicitud.

Creo que puede estar fuera de suerte.

Otros consejos

La única manera que puedo pensar de hacer esto es crear un proxy en otro (con PHP) del servidor para que se capturen los datos para usted, pero se detendrá cuando ha habido un cierto límite de tiempo de espera alcanzado (y que sólo se puede devolver un resultado vacío).

Esto es puramente, puramente teórico:

etiquetas <script> pueden insertarse dinámicamente en el DOM, momento en el que la secuencia de comandos se encontraron y procesada. Esta inyección de etiquetas de script dinámicas es cómo algunos alcanzan entre dominios "AJAX".

Me imagino que podría declarar una variable global var hasLoaded = false;. Al final de la secuencia de comandos que está intentando cargar se podría asignar a esa variable verdadera hadLoaded=true;. Después de inyectar la etiqueta de script en el DOM usted podría entonces la patada inicial de un setTimeout (), cuya función de devolución de llamada comprueba para ver si "hasLoaded" se establece en true. Si no es así, se puede asumir el guión aún no se ha cargado completamente en el navegador. Si es así, se puede asumir que se haya cargado por completo.

Una vez más, esto es teórico, pero si se prueba que asegúrese de informar, yo soy muy curioso.

Creo que la única manera de hacerlo es tomar el contenido del archivo a través de Ajax y luego ponga un temporizador. Si la solicitud termina antes de que el temporizador se pueden evaluar los respons con eval (que no es la mejor solución de todos modos), de lo contrario se puede detener la petición AJAX y escribir el mensaje de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top