Promise.all与嵌套的Promise.all [英] Promise.all with nested Promise.all
问题描述
我已经嵌套了数组,我能够为第二级数组检索promises,但是在顶级完成后我也不知道如何实现然后
。 / p>
I've nested arrays, I'm able to retrieve promises for the 2nd level array but not sure how to implement a then
once top level finishes as well.
result.forEach(function(entity){ // outer list ???
return Promise.all(entity.urls.map(function(item){
return requestURL(item.href);
}));
});
例如,如果结果
有两个或更多商品和每个商品
有10个或更多要获取的网址,我们如何实现然后
所有承诺的[Promise.all] [1]
。原生解决方案请。
for instance if results
has two or more items and each item
has 10 or more urls to fetch, how would we implement then
of [Promise.all][1]
for all the promises. Native solution please.
基本上以正确的方式处理嵌套的承诺数组。
Basically to handle nested arrays of promises in a right way.
数据结构:
var result = [
{
urls: [
{href: "link1"},
{href: "link2"},
{href: "link3"}
]
},
{
urls: [
{href: "link4"},
{href: "link5"},
{href: "link6"}
]
}
];
推荐答案
使用 map
而不是 forEach
,并将其包装在另一个 Promise.all
调用中。
Use map
instead of forEach
, and wrap it inside another Promise.all
call.
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);
});
您还可以使用立即调用的生成器。例如,要获得扁平化结果,
You can also use an immediately invoked generator. For example, to get flattened results,
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);
});
这篇关于Promise.all与嵌套的Promise.all的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!