0

最初のXHRで条件付きチェックを実行する必要があり、条件が満たされた場合は、setrequestヘッダーを使用して範囲を制限する2番目の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 /インターネットはタイムループロジックをサポートしていません、申し訳ありません)。これは、リクエストが送信されないことを意味します。おそらくあなたはこれが欲しい:

  • 何かをする
  • リクエストを準備する
  • リクエストが完了したとき
    • 応答で何かをする
  • リクエストを送信する

コードを編集して、

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 に答える