javascript - 从数组中顺序执行一堆 WinJS promise

标签 javascript asynchronous coffeescript promise winjs

我有一组要按顺序下载的 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/

相关文章:

javascript - Highcharts 折线图向下钻取无法正常工作

javascript - 将 JSON String/JS 对象映射到具有私有(private)属性的 Typescript 类

带有默认值的 Array.reduce 的 CoffeeScript 习惯用法

使用 CoffeeScript 语法的 JavaScript - if 条件 : optimize if statement structure

javascript - 等待所有回调完成执行,没有静态时间

javascript - 使用 PHP 和 mysql 的 morrisJS 条形图人口

javascript - 我无法将 PreactX 组件直接渲染到 document.body 中

javascript - 如何在回调函数中访问全局范围变量? [JS]

python - Tornado 异步请求不起作用,我的代码有什么问题?

javascript - 在 NodeJS 和 Mocha 中循环的最佳方法是什么?