你面临的问题是,LoadNavA
和LoadNavB
调用异步操作,它可以在任何顺序返回,但你试图执行一些排序。这是一个问题,因为在实际执行回调的过程中,您的循环已经完成,所以您尝试保留处理是错误的。
相反,您需要的是按顺序调用某些异步操作的方法。我写了一个通用的函数来实现:
// 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
函数即可。这是我们前进播放列表中下一个元素的机制,以便可以为每个元素重复该过程。
你想要加载这些?也就是说,你是否试图等待加载下一个,直到当前的一个完成? –
是的,这些元素必须按照正确的顺序排列,对于整个系统来说(对我来说)是最困难的,当轨道3比轨道2早加载时,它首先放置轨道3和轨道2,但必须开始加载轨道3时,轨道1和2已经加载 – alpjef
好的,这里有一个通用的方法,我试图在下面解释。 –