0

だからここに状況があります:

サーバーからデータをプルする再帰的な非同期AJAX呼び出しがあります。この再帰呼び出しは、ユーザーがログインしたときに1回だけ発生します。ナビゲートするためにAJAX呼び出しを必要とする別のページがあります(基本的に遅延ロードされたツリー)。最初のAJAX呼び出しが行われている間、これらの他の呼び出しは通過するのに時間がかかります。最初の呼び出しは2,000もの要求を行う可能性があるため、この遅延はかなり長くなる場合があります。

基本的に私が達成したいのは、他の呼び出しが行われたときに再帰呼び出しを「一時停止」することです。擬似コード:

function recursiveAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // do stuff
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            recursiveAjax();
        }
    });
}

function navigationAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // pause recursiveAjax();
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            // resume recursiveAjax();
        }
    });
}
4

3 に答える 3

2

最も簡単な方法:

window.recurse = true;
function recursiveAjax(){    
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // do stuff
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            if(window.recurse){
               recursiveAjax();
            }
        }
    });
}

function navigationAjax(){    
    window.recurse=false;
    $.ajax( {
        async : true,
        url : 'someurl',
        dataType : 'json',
        beforeSend : function(xhr) {
            // pause recursiveAjax();
        },
        error : function(xhr, ajaxOptions, thrownError) {
            // handle errors
        },
        success : function(data) {
            //conditions
            window.recurse=true;
            recursiveAjax();
        }
    });
}
于 2012-07-05T13:26:39.500 に答える
1

JavaScriptは非同期言語であるため、他のコメントのようにコールバックだけで必要なように考えることができます(上記を参照)。しかし、あなたの問題について考えてみてください。ほとんどの場合、Webで非同期で作業する方が良いでしょう。本当にこれが欲しいですか?

于 2012-07-05T13:29:49.937 に答える
1

2つのリクエストを同時に実行したくない場合は、再帰メソッドにどちらか一方を実行させます。ナビゲーション呼び出しが必要なときにフラグを設定し、再帰メソッドに次の反復を要求するようにします。

var navigationCall = false;

function recursiveAjax(){
  if (navigationCall) {
    navigationCall = false;
    $.ajax( {
      async : true,
      url : 'someurl',
      dataType : 'json',
      error : function(xhr, ajaxOptions, thrownError) {
        // handle errors
      },
      success : function(data) {
        //conditions
        recursiveAjax();
      }
    });
  } else {
    $.ajax( {
      async : true,
      url : 'someurl',
      dataType : 'json',
      beforeSend : function(xhr) {
        // do stuff
      },
      error : function(xhr, ajaxOptions, thrownError) {
        // handle errors
      },
      success : function(data) {
        //conditions
        recursiveAjax();
      }
    });
  }
}

function navigationAjax(){
  navigationCall = true;
}

注:window.TimeOutサーバーへの要求のストリームを抑制するために再帰を実行する呼び出しを追加することをお勧めします。人間の目で変更を確認できるよりも頻繁にサーバーを呼び出すことには意味がありません。

于 2012-07-05T13:42:16.213 に答える