javascript – 使用嵌套Promise.all的Promise.all

前端之家收集整理的这篇文章主要介绍了javascript – 使用嵌套Promise.all的Promise.all前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经嵌套了数组,我能够检索第二级数组的promises,但不知道如何实现一次顶级的数组完成.
  1. result.forEach(function(entity){ // outer list ???
  2. return Promise.all(entity.urls.map(function(item){
  3. return requestURL(item.href);
  4. }));
  5. });

例如,如果结果有两个或多个项目,并且每个项目有10个或更多要获取的网址,那么我们如何为所有承诺实现[Promise.all] [1].原生解决方案请.

基本上以正确的方式处理嵌套的promises数组.

数据结构:

  1. var result = [
  2. {
  3. urls: [
  4. {href: "link1"},{href: "link2"},{href: "link3"}
  5. ]
  6. },{
  7. urls: [
  8. {href: "link4"},{href: "link5"},{href: "link6"}
  9. ]
  10. }
  11. ];

解决方法

使用map而不是forEach,并将其包装在另一个Promise.all调用中.
  1. var arr = [
  2. {subarr: [1,2,3]},{subarr: [4,5,6]},{subarr: [7,8,9]}
  3. ];
  4. function processAsync(n) {
  5. return new Promise(function(resolve) {
  6. setTimeout(
  7. function() { resolve(n * n); },Math.random() * 1e3
  8. );
  9. });
  10. }
  11. Promise.all(arr.map(function(entity){
  12. return Promise.all(entity.subarr.map(function(item){
  13. return processAsync(item);
  14. }));
  15. })).then(function(data) {
  16. console.log(data);
  17. });

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

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

猜你在找的JavaScript相关文章