循環在兩個不同的陣列,兩個for循環相互嵌套異步(如塊和setTimeout
sourced from here),並試圖用從W3Schools here(標籤之一)進度條的例子。進度條使用嵌套for循環
的來源(稍微修改了 '完成' 回調)異步函數:
function loopAsync(array, fn, done, chunk, context) {
context = context || window;
chunk = chunk || 10;
var index = 0;
function doChunk() {
var cnt = chunk;
while (cnt-- && index < array.length) {
// callback called with args (value, index, array)
fn.call(context, array[index], index, array);
++index;
//console.log("index is " + index);
progressBar(index);
}
if (index < array.length) {
// set Timeout for async iteration
setTimeout(doChunk, 1);
} else {
done && done();
}
}
doChunk();
}
無論是asnychronous,這些是即使與正常for循環同樣的問題:
W3School示例使用的是
setInterval
,這是不準確的,因爲for循環可能已經在setInterval
之前完成處理。有兩個嵌套的for循環,所以不是跟蹤(例如)
i
在for (var i=0...)
,它需要跟蹤的第一循環*對於精度的第二循環的進展(如不出現停止 - 尤其是因爲第二個循環可能會有比第一個更大的數組長度)。
例如:
異步使用上述鏈接例如:
loopAsync(arr1, function (item1) {
loopAsync(arr2, function (item2) {
//Comparing or processing item1 with item2
});
}, doNext);
或者,基本上不異步循環相同的:
for (var item1 = 0; item1 < arr1.length; ++item1) {
for (var item2 = 0; item2 < arr2.length; ++item2) {
//Doing things... need to track progress of both?
}
}
- 需要是通用的,可以用於任何嵌套(或非嵌套)的for-loop歌劇灰。
這些問題應該如何解決,最好不使用jQuery?
但...你執行的代碼盟友表演根本不是異步的。如果你想要一個進度條,你需要用'setTimeout()'或'setInterval()'而不是'for'來重寫循環,就像你鏈接的代碼一樣。 – nnnnnn
@nnnnnn請重新閱讀第一段... – user1679669
我在評論前閱讀了兩遍。你似乎在說「這是一些異步處理數組的代碼,但我將忽略它,現在這裏是一個簡單的同步嵌套for循環,爲什麼不使用鏈接代碼中的概念?關於進度條代碼,你不需要一個單獨的時間間隔,你可以從循環的相同函數中控制它。你想要一個進度條用於整體進度還是每個循環一個進度條? – nnnnnn