現在のロジックは次のとおりです。
- 何かをする
- リクエストを準備する
- リクエストが完了したとき
これは、応答が返される前に要求が送信されないことを意味します。論理的には、リクエストを送信する前に応答は返されません(Javascript /インターネットはタイムループロジックをサポートしていません、申し訳ありません)。これは、リクエストが送信されないことを意味します。おそらくあなたはこれが欲しい:
- 何かをする
- リクエストを準備する
- リクエストが完了したとき
- リクエストを送信する
コードを編集して、
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