代码之家  ›  专栏  ›  技术社区  ›  Kay

如何使promise.all回复变平

  •  0
  • Kay  · 技术社区  · 5 年前

    我有一个产品列表,对于每个产品,我都会调用一个api来获取产品订阅。

       const subscriptions = await Promise.all(products.flatMap((p: any) => {
            const { username, password } = p.credentials;
            return GetSubscription(username, password);
        }));
        console.log(subscriptions);
    
    

    实际 :

    [ [ {}, {}, {}, ] ]

    现在你可以看到我在这里有一个双嵌套数组,我不需要外部数组,我该如何展平这个数组,我本以为在这里使用flatMap可能会对我有所帮助,但事实并非如此。

    预期 :

    [ {}, {}, {}, ]

    当然,我可以简单地做 subscriptions[0] 但如果可能的话,我尽量避免这种情况。

    0 回复  |  直到 5 年前
        1
  •  5
  •   Orelsanpls    5 年前

    使用点差运算符

    async function func() {
      return 'A';
    }
    
    (async() => {
      const [...ret] = await Promise.all([
        func(),
        func(),
        func(),
      ]);
    
      console.log(ret);
    })();

    或者

    async function func() {
      return 'A';
    }
    
    (async() => {
      const ret = await Promise.all([
        func(),
        func(),
        func(),
      ]);
    
      console.log(ret.reduce((tmp, x) => [...tmp, x], []));
    })();

    正如你在评论中所说,在tsconfig中指定ES2019,你可以使用 Array.flat :

    async function func() {
      return 'A';
    }
    
    (async() => {
      const ret = await Promise.all([
        func(),
        func(),
        func(),
      ]);
    
      console.log(ret.flat());
    })();
        2
  •  2
  •   Ashish Modi    5 年前

    这应该对你有帮助。

    const input = [[{}, {}, {}], [{"hi": "bye"}]];
    
    
    console.log(input.flat());
        3
  •  0
  •   Jonathan    1 年前

    Array.flatMap() Array.map().flat() 所以 await Promise.all(Array.map().flat()) 将应用于以下结果 flat 。当映射回调是异步的时,您需要解析以下结果 map 打电话之前 平的 。在这种情况下,您需要使用 (await Promise.all(Array.map())).flat() .