我已经嵌套了数组,我能够检索第二级数组的promises,但不知道如何实现一次顶级的数组完成.
- result.forEach(function(entity){ // outer list ???
- return Promise.all(entity.urls.map(function(item){
- return requestURL(item.href);
- }));
- });
例如,如果结果有两个或多个项目,并且每个项目有10个或更多要获取的网址,那么我们如何为所有承诺实现[Promise.all] [1].原生解决方案请.
基本上以正确的方式处理嵌套的promises数组.
数据结构:
- 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);
- });
- var arr = [
- {subarr: [1,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);
- });