【问题标题】:Promise.all with nested Promise.allPromise.all 与嵌套的 Promise.all
【发布时间】:2016-11-20 12:46:29
【问题描述】:

我已经嵌套了数组,我能够检索第二级数组的承诺,但不知道一旦顶级完成后如何实现 then

result.forEach(function(entity){ // outer list ???
    return Promise.all(entity.urls.map(function(item){
        return requestURL(item.href);
    }));
});

例如,如果results 有两个或更多项目,并且每个item 有10 个或更多的url 来获取,我们将如何为所有承诺实现then[Promise.all][1]。请使用本机解决方案。

基本上以正确的方式处理嵌套的承诺数组。

数据结构:

var result = [
    {
        urls: [
            {href: "link1"},
            {href: "link2"},
            {href: "link3"}
        ]
    },
    {
        urls: [
            {href: "link4"},
            {href: "link5"},
            {href: "link6"}
        ]
    }
];

【问题讨论】:

  • 为什么不将数组数组展平为单个数组,然后做一个promise.all?
  • 是的,扁平化是解决方案,但是如何在使用迭代器模式的同时以一种优雅且噪音较小的方式做到这一点。我可以创建一个数组并将项目推送到它并在最后做一个Promise.all,但是让我们看看是否有一个优雅的方法
  • “我已经嵌套了数组”你能在问题中包含数组的文本吗?
  • 添加数据结构

标签: javascript node.js promise


【解决方案1】:

使用map 代替forEach,并将其包装在另一个Promise.all 调用中。

var arr = [
  {subarr: [1,2,3]},
  {subarr: [4,5,6]},
  {subarr: [7,8,9]}
];
function processAsync(n) {
  return new Promise(function(resolve) {
    setTimeout(
      function() { resolve(n * n); },
      Math.random() * 1e3
    );
  });
}
Promise.all(arr.map(function(entity){
  return Promise.all(entity.subarr.map(function(item){
    return processAsync(item);
  }));
})).then(function(data) {
  console.log(data);
});

您还可以使用立即调用的生成器。例如,要获得扁平化的结果,

var arr = [
  {subarr: [1,2,3]},
  {subarr: [4,5,6]},
  {subarr: [7,8,9]}
];
function processAsync(n) {
  return new Promise(function(resolve) {
    setTimeout(
      function() { resolve(n * n); },
      Math.random() * 1e3
    );
  });
}
Promise.all(function*() {
  for(var entity of arr)
    for(var item of entity.subarr)
      yield processAsync(item);
}()).then(function(data) {
  console.log(data);
});

【讨论】:

  • 数组结构有点像var arr = [ [1,2,3], [4,5,6], [7,8,9] ];能不能更新一下
  • 如果我将您的示例与我的数据结构一起使用,我会收到错误,TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined
  • 请检查我的数据结构
  • 谢谢,现在很好,问题,原来promise.all 也处理嵌套数组?请解释
  • 您可能正在迭代一个不可迭代的对象。试试for(var entity of result) for(var url of entity.urls) yield requestURL(url.href)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多