Javascript 如何在XHR上执行条件语句

Javascript 如何在XHR上执行条件语句,javascript,ajax,Javascript,Ajax,我需要对第一个XHR执行条件检查,如果满足条件,则执行第二个XHR,该XHR将使用set请求头来限制范围 function getData( url ) { if (y==0) { alert ("you set vaue of y to 1"); var request = new XMLHttpRequest(); request.onreadystatechange = function(){

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

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

}

您当前的逻辑如下:

  • 做点什么
  • 准备请求
  • 当请求完成时
    • 对回应做点什么
    • 发送请求
这意味着请求在其响应返回之前不会被发送。从逻辑上讲,在发送请求之前,响应也不会返回(很抱歉,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; 
    }); 
}

参考:

您是否试图从响应处理程序中设置请求头???我可以得到第一个警报来处理“您将y设置为1”,但XHR没有响应?y在XHR之前作为全局变量启动,并设置为0。您没有发送任何请求。您刚刚创建了一个并设置了它的处理程序。很抱歉,即使有请求。发送未注释仍然没有响应。谢谢您的帮助!