0

我需要对第一个 XHR 执行条件检查,如果满足条件,则执行第二个 XHR,它将使用设置请求标头来限制范围。

function getData( url )
{           
    if  (y==0) { 
    alert ("you set vaue of y to 1");
        var request = new XMLHttpRequest();  
        request.onreadystatechange = function(){
            if ( request.readyState == 4 ){
                renderData( request.responseText );
                request.open( "GET", "TheData.csv", true );
                //request.send( null ); 
                y = 1;
            }     
        }
    } else {
        var request = new XMLHttpRequest();  
        request.onreadystatechange = function(){
            if ( request.readyState == 4 ){
                renderData( request.responseText );
                request.open( "GET", "TheData.csv", true );
                //request.send( null ); 
                request.setRequestHeader("Range", "bytes=" + BytesRead + "-");  
            }
        }
    }

}
4

1 回答 1

0

你目前的逻辑如下:

  • 做一点事
  • 准备请求
  • 当请求完成时
    • 对响应做一些事情
    • 发送请求

这意味着在响应返回之前不会发送请求。从逻辑上讲,在您发送请求之前也不会返回响应(Javascript / Internet 不支持时间循环逻辑,抱歉)。这意味着请求永远不会被发送。也许你想要这个:

  • 做一点事
  • 准备请求
  • 当请求完成时
    • 对响应做一些事情
  • 发送请求

编辑您的代码,

function getData( url ){           
    if  (y==0) { 
    alert ("you set vaue of y to 1");
        var request = new XMLHttpRequest();  
        request.onreadystatechange = function(){
            if ( request.readyState == 4 ){
                renderData( request.responseText );
                y = 1;
            }     
            request.open( "GET", "TheData.csv", true );
            request.send( null ); 
       }
    } else {
        var request = new XMLHttpRequest();  
        request.onreadystatechange = function(){
            if ( request.readyState == 4 ){
                renderData( request.responseText );
                request.setRequestHeader("Range", "bytes=" + BytesRead + "-");  
            }
        }
        request.open( "GET", "TheData.csv", true );
        request.send( null ); 
   }
}

还要注意你重复了很多次。您可以将代码缩短为

function getData( url ){           
    var request = new XMLHttpRequest();  
    if (y!=0) { 
        request.setRequestHeader("Range", "bytes=" + BytesRead + "-");  
    }
    request.onreadystatechange = function(){
        if ( request.readyState == 4 ){
            renderData( request.responseText );
            y = 1; //assuming `y` never gets reset to 0
        }
    }
    request.open( "GET", "TheData.csv", true );
    request.send( null ); 
}

另请注意,变量BytesRead应该是小写,而不是大写(=> bytesRead),并且您不需要传递null参数来发送(如果我正确阅读了文档)。

另请注意,通过全局变量传递参数是一种不好的做法。在你的情况下,BytesRead看起来像一个全局变量(我不认为这是一个内部函数)。


另请注意,即使您使用自定义标头,jQuery 也会稍微简化流程,您是否愿意使用 jQuery:

function getData(url){
    var headers = {};
    if(y!=0){
        headers.range = "bytes=" + BytesRead + "-"
    }
    $.ajax(url, {
      headers: headers,
      dataType: "text"   //prevent automatic parsing (degression)
    }).done(function(response){
      renderData(response);
      y=1;          
    });
}

甚至

function getData(url){
    $.ajax(url, {
        headers: (y!=0) ? {} : {range : "bytes=" + BytesRead + "-"},
        dataType: "text"
    }).done(function(response){
        renderData(response);
        y=1; 
    }); 
}

参考:https ://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest

于 2013-02-13T13:19:45.173 回答