[英]Sequentially execute a bunch of WinJS promises from an array
我有一个要依次下载的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());
现在,我想同时介绍两个URL的并行下载。
因此它将下载:[url1,url2]然后[url3,url4],最后是[url5]
函数的结果也应该是每次下载承诺的结果,类似于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
链传递,始终在每个步骤之后增长。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.