你面臨的問題是,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
好的,這裏有一個通用的方法,我試圖在下面解釋。 –