我有一组要按顺序下载的 URL,一次 2 个 URL。
var urls = [url1,url2,url3,url4,url5];
循环应该使用某种异步函数下载所有 URL,同时 2 个 URL 按照它们在数组中出现的顺序下载。
基本的顺序循环是使用 .reduce
完成的,其工作方式如下:
preloadPromise = urls.reduce(function(p, url) {
return p.then(WinJS.Utilities.Scheduler.schedulePromiseBelowNormal).then(function() {
return preloadOneAsync(url);
}).then(null, function(error) {
if (error.name !== "Canceled") {
logger.error("Could not create preloaded " + url, error);
}
});
}, WinJS.Promise.as());
现在我想介绍一下同时并行下载2个URL。
所以它会下载:[url1,url2] 然后是 [url3,url4] 最后是 [url5]
此外,该函数的结果应该是每个下载 promise 的结果,类似于 WinJS.Promise.join
的工作方式。
最佳答案
让我们抽象出将数组分解为元组的函数
function chunkBy(array, n) {
var chunks = [];
for (var i=0; i<array.length; i+=n)
chunks.push(array.slice(i, n));
return chunks;
}
以及为每个项目完成工作的函数:
function tryToLoad(url) {
return WinJS.Utilities.Scheduler.schedulePromiseBelowNormal() // not sure
.then(function() { return preloadOneAsync(url); })
.then(null, function(error) {
if (error.name !== "Canceled") {
logger.error("Could not create preloaded " + url, error);
}
});
}
并行处理多个项目的函数就是
function loadAll(urls) {
return WinJS.Promise.join(urls.map(tryToLoad));
}
所以我们现在可以在序列的生成中使用它:
preloadPromise = chunkBy(urls, 2).reduce(function(p, urls) {
return p.then(function(prevResults) {
return loadAll(urls).then(function(results) {
return prevResults.concat(results);
});
});
}, WinJS.Promise.as([]));
结果数组通过 p
链传递,每一步都在增长。
关于javascript - 从数组中顺序执行一堆 WinJS promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515226/