2011-11-17 76 views
1
for(var P in ReturnData.Playlist){ 
    var IsLoaded = false; 
    if(PlayerName == "A"){ 
     LoadNavA(false,false,false, ReturnData.Playlist[P], function(){ 
      IsLoaded = true; 
      alert(); 
     }); 
     }else{ 
     LoadNavB(false,false,false, ReturnData.Playlist[P],function(){ 
      IsLoaded = true; 
     }); 
    } 
    if(IsLoaded == true) continue; 
} 

这是用于音乐播出系统的。 LoadNavALoadNavB函数异步地将音轨加载到播放列表。这些元素必须按正确的顺序排列。当轨道3比轨道2早加载时,它首先放置轨道3和轨道2,但当轨道1和2已经加载时,它应该开始加载轨道3。JavaScript foreach循环转到回调中的下一个元素

当调用回调LoadNavALoadNavB时,循环应该继续。怎么样?

+0

你想要加载这些?也就是说,你是否试图等待加载下一个,直到当前的一个完成? –

+0

是的,这些元素必须按照正确的顺序排列,对于整个系统来说(对我来说)是最困难的,当轨道3比轨道2早加载时,它首先放置轨道3和轨道2,但必须开始加载轨道3时,轨道1和2已经加载 – alpjef

+0

好的,这里有一个通用的方法,我试图在下面解释。 –

回答

1

你面临的问题是,LoadNavALoadNavB调用异步操作,它可以在任何顺序返回,但你试图执行一些排序。这是一个问题,因为在实际执行回调的过程中,您的循环已经完成,所以您尝试保留处理是错误的。

相反,您需要的是按顺序调用某些异步操作的方法。我写了一个通用的函数来实现:

// receives a callback and the elements to iterate 
function loop(list, fn) { 
    if (!list || list.length <= 0) 
     return; 
    (function chain(i) { 
     if (i >= list.length) 
      return; 
     fn(list[i], function() { 
      chain(i + 1); 
     }); 
    })(0); 
} 

此功能假定您给它会执行一些操作,一旦完成该操作将开球链下一步的回调。为了使这个具体,这里是一个基于你的代码的例子。

首先,一个小设置,这样我们就可以与你的榜样工作:

var PlayerName = "B"; 
var ReturnData = {}; 
ReturnData.Playlist = ["song1", "song2", "song3"]; 

function LoadNavA(b1, b2, b3, el, fn) { 
    // this could be any asynchronous call (e.g. Ajax) 
    // using setTimeout here for illustration 
    window.setTimeout(fn, 2000); 
} 

var LoadNavB = LoadNavA; // for brevity 

现在,loop实际使用情况:

loop(ReturnData.Playlist, function(song, next) { 
    if (PlayerName == "A") { 
     LoadNavA(false, false, false, song, function() { 
      alert("LoadNavA: " + song); 
      next(); 
     }); 
    } else { 
     LoadNavB(false, false, false, song, function() { 
      alert("LoadNavB: " + song); 
      next(); 
     }); 
    } 

}); 

给出的第二个参数loop回调将为列表中的每个元素执行一次。它接收播放列表中的一个元素作为参数,并接收一个称为next的函数。此回调可以自由执行任何异步操作,只要这些操作在完成后调用next函数即可。这是我们前进播放列表中下一个元素的机制,以便可以为每个元素重复该过程。

+0

这是一个音乐播出系统,Te LoadNavA和LoadNavB函数加载到播放列表的异步轨道。这个foreach是从服务器加载播放列表到客户端播放列表。当这个foreach是calles,轨道arent以正确的顺序 – alpjef

+0

谢谢,这将帮助我很多 – alpjef

相关问题