需要延迟功能javascript

时间:2011-02-01 15:31:54

标签: javascript xmlhttprequest

你好我正在制作一个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 个答案:

答案 0 :(得分:4)

你为什么要发明轮子?

您应该将处理程序传递给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;
          }
     }
};

答案 1 :(得分:2)

如果我理解正确的话,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

答案 2 :(得分:0)

我们可以编写一个函数来检查xmlhttp-object的状态:

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
});

但有两件事:

  • 无论readyState如何,checkState函数都会返回,因此请确保您只在回调中执行依赖于它的事情,而不是在之后。
  • 如果readyState和status永远不会得到你想要的值,那你就不走运了(但你可以扩展函数来接受第二个回调来处理超时的情况)。

答案 3 :(得分:-2)

也许使用像

这样的东西

编辑:使用onreadystatechange:

Connection.onreadystatechange = function()
{
    if (Connection.readyState != 4)
    {
        return;
    }
    else
    {
        // do your thing
    }
};