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

我正在引入递归以按对象在数组中的顺序加载对象。我还介绍了一些您可能认为不需要包含的代码来验证我们是否有一个数组(以防某些错误的其他函数调用它,或其他)

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 回答
2

如果您在原始问题中引用的 ajax 调用(在其他人编辑之前)是异步的,那么您将不得不使用 ajax 调用的完成功能来触发对 MovieLoader 的下一次调用。

由于 ajax 调用的完成时间不确定,因此尝试使用某种 setTimeout() 来猜测 ajax 调用需要多长时间并不完全可靠。对 ajax 结果进行排序的唯一 100% 可靠的方法是对 ajax 调用进行排序,并且在第一个调用完成之前不启动下一个 ajax 调用,等等......

您没有向我们展示您的实际 ajax 调用,因此我们无法更具体地了解实现此功能的最佳方式。

于 2012-06-16T04:22:38.537 回答