Любой способ изящно обеспечить ограничение времени ожидания при загрузке медленного внешнего файла через JavaScript? - PullRequest
9 голосов
/ 07 января 2010

Я использую javascript для включения некоторого контента, обслуживаемого из файла php на другом сервере. Однако этот другой сервис может иногда работать некорректно и загружаться долго или не загружаться вообще.

Есть ли способ в JS попытаться получить внешние данные за x секунд, прежде чем произойдет сбой, и отобразится сообщение «Пожалуйста, попробуйте еще раз»?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>

Ответы [ 4 ]

2 голосов
/ 07 января 2010

Пара проблем: вы можете использовать пороги тайм-аута с XMLHttpRequest (он же ajax), но тогда, поскольку он на otherserver.com, вы не можете использовать XMLHttpRequest (и поддерживать все браузеры класса A) из-за Одинаковое ограничение политики происхождения .

Если в сценарии введено какое-либо глобальное имя (например, любое имя переменной, имя функции и т. Д.), Вы можете попробовать setTimeout, чтобы продолжить его проверку:

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)

Проблема, на мой взгляд, в том, что вы не можете отменить запрос на скрипт. Пожалуйста, кто-нибудь исправит меня, если я ошибаюсь, но удаление <script> из DOM все равно оставит запрос браузера активным. Таким образом, хотя вы можете обнаружить , что загрузка скрипта занимает более x секунд, вы не можете отменить запрос.

Думаю, тебе не повезло.

2 голосов
/ 07 января 2010

Единственный способ сделать это - создать прокси на другом (с поддержкой PHP) сервере, который будет извлекать данные для вас, но остановится, когда будет достигнут определенный лимит времени ожидания. (и он может просто вернуть пустой результат).

0 голосов
/ 08 января 2010

Это чисто, чисто теоретически:

<script> теги могут быть динамически вставлены в DOM, после чего сценарий будет выбран и обработан. Эта динамическая инъекция тега сценария - это то, как некоторые достигают междоменного «AJAX».

Я думаю, вы могли бы объявить глобальную переменную var hasLoaded = false;. В конце скрипта, который вы пытаетесь загрузить, вы можете установить для этой переменной значение true hadLoaded=true;. После внедрения тега script в DOM вы можете запустить setTimeout (), чья функция обратного вызова проверяет, установлено ли для hasLoaded значение true. Если это не так, вы можете предположить, что скрипт еще не полностью загружен в браузер. Если это так, вы можете предположить, что он полностью загрузился.

Опять же, это теоретически, но если вы проверите, обязательно доложите, мне очень любопытно.

0 голосов
/ 07 января 2010

Я думаю, что единственный способ сделать это - взять содержимое файла через ajax, а затем установить таймер. Если запрос заканчивается до таймера, вы можете оценить ответ с помощью eval (это не лучшее решение в любом случае), в противном случае вы можете остановить запрос ajax и написать сообщение об ошибке.

...