首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有嵌套Promise.all的Promise.all

带有嵌套Promise.all的Promise.all
EN

Stack Overflow用户
提问于 2016-07-18 02:21:22
回答 1查看 37.2K关注 0票数 24

我已经嵌套了数组,我可以检索第二层数组的承诺,但也不确定在顶层完成后如何实现then

代码语言:javascript
复制
result.forEach(function(entity){ // outer list ???
    return Promise.all(entity.urls.map(function(item){
        return requestURL(item.href);
    }));
});

例如,如果results有两个或两个以上的项,并且每个item都有10个或更多的urls可获取,那么我们将如何为所有承诺实现then of [Promise.all][1]。请给我原生溶液。

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

数据结构:

代码语言:javascript
复制
var result = [
    {
        urls: [
            {href: "link1"},
            {href: "link2"},
            {href: "link3"}
        ]
    },
    {
        urls: [
            {href: "link4"},
            {href: "link5"},
            {href: "link6"}
        ]
    }
];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-18 02:54:30

使用map而不是forEach,并将其包装到另一个Promise.all调用中。

代码语言:javascript
复制
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);
});

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

代码语言:javascript
复制
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);
});

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38427761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档