首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将等待数据转换成单数组?

如何将等待数据转换成单数组?
EN

Stack Overflow用户
提问于 2021-08-31 10:11:22
回答 3查看 63关注 0票数 0

我有这段代码,我想把它放在一个数组中。

数据产生输出如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  connections.elements.map((val: any) => {
   const url = 'link'
   return new Promise((resolve) => {
      axios.post(url, val.firstName).then((res: { data: any }) => {
        resolve(searchRequestBuilder(res.data.AllResults));
      });
    });
  });

  const searchRequestBuilder = async (data: any) => {
    console.log(await data);
    // for await (let resolvedPromise of data) {
    // console.log(resolvedPromise);
    // }
  };

我想这样做:

我已经尝试创建一个变量并使用.push,但它仍然不能组合到一个数组中。我错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-31 11:24:49

因此,由于您的.map函数将返回一个promises数组,因此您可以将其存储在一个变量中,并且可以使用Promise.all或Promise.allSettled等待所有apis的解析,并且您可以按照请求的顺序在单个数组中获取所有结果。

这不是问题的一部分,另一件事是,如果你不小心,在每个api请求上使用await,它可能会造成请求的瀑布模式,这意味着它将等待API 1完成,然后API 2完成。但是按照这里的编写方式,它将并行地发出所有的请求,所以这将一起请求所有的API,一旦最后一个请求得到解决,Promise.all或allSettled将触发其回调。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    const searchRequestBuilder = async (data: any) => {
         console.log(await data);
    }
    async function makeAPIrequests(){    
         let arrrayOfPromises = connections.elements.map((val: any) => {
           const url = 'link'
           return new Promise((resolve) => {
              axios.post(url, val.firstName).then((res: { data: any }) => {
                resolve(searchRequestBuilder(res.data.AllResults));
              });
            });
          });
        
         Promise.allSettled(arrrayOfPromises).
            then((results) => console.log(results))
 
    }

编辑:除此之外,我不认为你需要在map函数中返回一个新的promise,如果你只是返回axios,它应该可以工作,因为axios本身会返回一个Promise。

票数 0
EN

Stack Overflow用户

发布于 2021-08-31 10:22:16

您可以尝试使用.concat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let allData = [];
allData = allData.concat(await data);
票数 0
EN

Stack Overflow用户

发布于 2021-08-31 10:38:02

存在的主要问题可能是您对元素数组的每一项都进行了新的调用。这可能会产生性能问题。最佳实践可能是只执行一次异步调用,然后获取所有项。

无论如何,如果出于某种原因,您确实需要进行所有这些ajax调用。如果你使用的是异步代码,那么你真的不知道什么时候所有的调用都被应答了。要解决这个问题,你需要在所有调用之后调用你的searchRequestBuilder。

我建议您使用Promise.all方法。I left you this link向您展示它是如何工作的。基本上,您需要做的是将所有的axios.post promises保存在一个数组中,并在循环之后调用Promises.all传递带有promises的数组,然后您就可以顺利地执行searchRequestBuilder了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69003527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文