2

関数 LoadTempMovieList() があり、sessionStorage からムービーをロードする必要があります。しかし、for ループの実行時間は、私が作成している AJAX 呼び出しが応答できるよりも高速であるように思われるため、最終的な出力の順序が正しくない場合があります。どうすればこの問題を解決できますか?

function LoadTempMovieList(){
  var obList = [];
  if(sessionStorage.struct != null){
    alert(sessionStorage.struct);
    obList = sessionStorage.struct.split(",");
    for(var i=0; i<obList.length;i++){
      MovieLoader(obList[i],"movie");
      //it use setTimeOut(), the problem also present 
    }
  }
}

アップデート

function MovieLoader(name,type,movieArray){
  $.ajax({
    ...
    data:{shortName:name,type:type},
    dataType:'html',
    success:function (html){
      if(html!="0"){
        ...
      }else{
        ...
      }
    }
  });
}
4

2 に答える 2

2

元の質問で参照した ajax 呼び出し (他の誰かがそれを編集する前) が非同期である場合は、ajax 呼び出しの完了関数を使用して、MovieLoader への次の呼び出しをトリガーする必要があります。

ajax 呼び出しが完了するまでに不確定な時間がかかるため、ある種の setTimeout() を使用して ajax 呼び出しにかかる時間を推測することは完全には信頼できません。ajax の結果を順序付けする唯一の 100% 信頼できる方法は、ajax 呼び出しを順序付けて、最初の呼び出しが完了するまで次の ajax 呼び出しを起動しないことです。

実際の ajax 呼び出しを表示しないため、これを実装するための最良の方法について具体的に説明することはできません。

于 2012-06-16T04:22:38.537 に答える
2

オブジェクトを配列にある順序でロードする再帰を導入しています。また、配列を取得したことを確認するために含める必要がないと思われるコードもいくつか紹介します (誤った他の関数がこれを呼び出す場合など)。

function LoadTempMovieList(){
  var obList = [];
  if(sessionStorage.struct != null){
    alert(sessionStorage.struct);
    obList = sessionStorage.struct.split(",");

    LoadMoviesInOrder(obList);
  }
}

function LoadMoviesInOrder(movies){
  if( Object.prototype.toString.call( movies ) === '[object Array]' ){
    //get the very first object in the array, take it off the array
    var movie = movies.shift();
    MovieLoader(movie,"movie",movies);
  }
}

function MovieLoader(name,type,movieArray){
  $.ajax({
    ...
    data:{shortName:name,type:type},
    dataType:'html',
    success:function (html){
      if(html!="0"){
        ...

        if (movieArray.length) { //test to see if there are more movies left by using truthiness
          //wait 50 ms and call this function again, so that we achieve recursion
          setTimeout(function(){LoadMoviesInOrder(movieArray); }, 50);
        }
      }else{
        ...
      }
    }
  });
}
于 2012-06-16T04:20:38.613 に答える