javascript - Promise的用法。递归中的所有操作似乎都不起作用

标签 javascript recursion promise async-await

实际的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/

相关文章:

c++ - 递归函数的内存分配

java - 如何提高Java递归的速度

haskell - Haskell 范围内二叉树的子树

javascript - 如何在不阻止页面渲染的情况下显示弹出警报消息以及如何每 30 秒刷新一次图表

javascript - Strongloop自定义脚本不退出

javascript - JS promise : Fulfill vs Resolve

javascript - 如何使用 Promises 在 Node 中编写同步函数

javascript - 扁平的 promise 链系列,每个 promise 调用都取决于先前调用的解决方案

javascript - 谷歌分析 : _setvar to new tracking code

javascript - 组织一个充满导出的大型帮助文件