Promise.all与嵌套的Promise.all
我嵌套数组,我能够检索第二级数组的承诺,但不知道如何执行一次, then
顶级完成以及。
result.forEach(function(entity){ // outer list ??? return Promise.all(entity.urls.map(function(item){ return requestURL(item.href); })); });
例如,如果results
有两个或更多的项目,每个item
有10个或更多的url需要获取,那么我们如何实现[Promise.all][1]
所有的promise。 请原生解决scheme。
基本上以正确的方式处理嵌套数组的承诺。
数据结构:
var result = [ { urls: [ {href: "link1"}, {href: "link2"}, {href: "link3"} ] }, { urls: [ {href: "link4"}, {href: "link5"}, {href: "link6"} ] } ];
使用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); });
首先压扁数组,然后应用Promise.all
var urls = result.map(function(entity) => {return entity.urls;}) urls = [].concat.apply([], urls) return Promise.all(urls.map(function(item){ return requestURL(item.href); }));