Нужна функция задержки JavaScript - PullRequest
4 голосов
/ 01 февраля 2011

Привет, я сейчас делаю запрос xmhhttp, но сайт загружается некоторое время, поэтому я получаю только ReadyState = 3 и status = 200. Поэтому мне нужно что-то, что ждет до readystate = 4, но я хочу ограничить эта функция, так что она проверяет только раз в секунду, если readystate = 4, иначе ничего не делать.

Как может выглядеть такая функция задержки?

   if (xmlhttp.readyState==4 && xmlhttp.status==200)//Add the delay here so that the else doesn't occur
    {
    var txt=xmlhttp.responseText;
    .....
  else {

    document.write("status: " + xmlhttp.readyState + " " + xmlhttp.status);
  }

Ответы [ 4 ]

4 голосов
/ 01 февраля 2011

Зачем тебе изобретать колесо?

Вы должны просто передать обработчик обратному вызову XHRs onreadystatechange.

xmlhttp.onreadystatechange = function() {
     switch( xmlhttp.readyState ) {
          case 4: {
              if (xmlhttp.status === 200) {
                  var txt = xmlhttp.responseText; // or do something else here
              }
              break;
          }
          case 3: {
              // go interactive !
              break;
          }
     }
};
2 голосов
/ 01 февраля 2011

A setInterval может помочь, если я вас правильно понимаю:

var seconds = 0;
var interval = setInterval(function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        // Stop checking
        clearInterval(interval);
        // Ready
        var txt = xmlhttp.responseText;

    } else if (++seconds > 10) { // Do we give up?
        clearInterval(interval);
        // Give up

    }
}, 1000); // Checks once every second
0 голосов
/ 01 февраля 2011

Мы можем написать функцию для проверки состояния вашего объекта xmlhttp:

var checkState = function(xmlhttp, callback) {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    callback(whatever, arguments, that, you, want, to, send);
  } else {
    // Check back again 1 sec later
    setTimeout(checkState, 1000);
  }
};

Тогда вы можете использовать его следующим образом:

checkState(xmlhttp, function(whatever, arguments, you, need) {
  // the code here will be run when the readyState is 4 and the status is 200
});

Хотя две вещи:

  • Функция checkState будет возвращаться независимо от readyState, поэтому убедитесь, что вы делаете только те вещи, которые зависят от нее, в обратном вызове, а не после.
  • Если readyState и status никогда не получают желаемогозначения, вам не повезло (но вы могли бы расширить функцию, чтобы принять второй обратный вызов, который будет обрабатывать случай тайм-аута).
0 голосов
/ 01 февраля 2011

Может быть использовать что-то вроде

Редактировать: использовать onreadystatechange:

Connection.onreadystatechange = function()
{
    if (Connection.readyState != 4)
    {
        return;
    }
    else
    {
        // do your thing
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...