Javascript 如何在XHR上执行条件语句
我需要对第一个XHR执行条件检查,如果满足条件,则执行第二个XHR,该XHR将使用set请求头来限制范围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(){
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 + "-");
}
}
}
}
您当前的逻辑如下:
- 做点什么
- 准备请求
- 当请求完成时
- 对回应做点什么
- 发送请求
- 做点什么
- 准备请求
- 当请求完成时
- 对回应做点什么
- 发送请求
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。您没有发送任何请求。您刚刚创建了一个并设置了它的处理程序。很抱歉,即使有请求。发送未注释仍然没有响应。谢谢您的帮助!