繁体   English   中英

从数组顺序执行一堆WinJS Promise

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM