实际的doSomething
函数将ele
发布到远程API进行一些计算。
我的calc函数应该获取每个元素的远程API计算的总和,它应该为每个元素运行而不会影响它们的嵌套位置。
但是,目前,我无法正常工作。我该如何解决?
const doSomething = (ele) => new Promise(resolve => {
console.log(ele);
resolve(ele * 2);//for example
})
const calc = (arr) => new Promise(
async(resolve) => {
console.log(arr.filter(ele => !Array.isArray(ele)));
let sum = 0;
const out = await Promise.all(arr.filter(ele => !Array.isArray(ele))
.map(ele => doSomething(ele)));
sum += out.reduce((a, b) => a + b, 0);
const out2 = await Promise.all(arr.filter(ele => Array.isArray(ele))
.map(ele => calc(ele)));
sum += out2.reduce((a, b) => a + b, 0);
resolve(sum);
}
)
const process = async () => {
console.log('processing..');
const arr = [1, 2, 3, 4, 5, [6,7], 1, [8,[10,11]]];
const out = await calc(arr);
console.log(out);
}
process();
最佳答案
虽然看起来我已经解决了不存在的问题-问题中的原始代码具有我在此答案中解决的所有缺陷,包括下面的第二和第三
是的,问题中的代码现在可以使用了!但这显然是有缺陷的
第一:因为您使用Promise.all会返回一个Promise.all,所以在calc函数中不需要Promise构造函数,如果使calc异步,则只需使用await
第二个:dosomething
!== doSomething
第三:out2
是一个数组,所以sum += out2
会让你搞砸
第四:.map(ele => doSomething(ele))
可以写为.map(doSoemthing)
-与calc(ele)
映射相同
因此,工作代码变为:
const doSomething = (ele) => new Promise(resolve => {
resolve(ele * 2); //for example
})
const calc = async(arr) => {
const out = await Promise.all(arr.filter(ele => !Array.isArray(ele)).map(doSomething));
let sum = out.reduce((a, b) => a + b, 0);
const out2 = await Promise.all(arr.filter(ele => Array.isArray(ele)).map(calc));
sum += out2.reduce((a, b) => a + b, 0);
return sum;
}
const process = async() => {
console.log('processing..');
const arr = [1, 2, 3, 4, 5, [6, 7], 1, [8, [10, 11]]];
const out = await calc(arr);
console.log(out);
}
process();
关于javascript - Promise的用法。递归中的所有操作似乎都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61554734/