我有这段代码,我想把它放在一个数组中。
数据产生输出如下所示:
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,但它仍然不能组合到一个数组中。我错过了什么?
发布于 2021-08-31 11:24:49
因此,由于您的.map函数将返回一个promises数组,因此您可以将其存储在一个变量中,并且可以使用Promise.all或Promise.allSettled等待所有apis的解析,并且您可以按照请求的顺序在单个数组中获取所有结果。
这不是问题的一部分,另一件事是,如果你不小心,在每个api请求上使用await,它可能会造成请求的瀑布模式,这意味着它将等待API 1完成,然后API 2完成。但是按照这里的编写方式,它将并行地发出所有的请求,所以这将一起请求所有的API,一旦最后一个请求得到解决,Promise.all或allSettled将触发其回调。
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。
发布于 2021-08-31 10:22:16
您可以尝试使用.concat
let allData = [];
allData = allData.concat(await data);
发布于 2021-08-31 10:38:02
存在的主要问题可能是您对元素数组的每一项都进行了新的调用。这可能会产生性能问题。最佳实践可能是只执行一次异步调用,然后获取所有项。
无论如何,如果出于某种原因,您确实需要进行所有这些ajax调用。如果你使用的是异步代码,那么你真的不知道什么时候所有的调用都被应答了。要解决这个问题,你需要在所有调用之后调用你的searchRequestBuilder。
我建议您使用Promise.all方法。I left you this link向您展示它是如何工作的。基本上,您需要做的是将所有的axios.post
promises保存在一个数组中,并在循环之后调用Promises.all
传递带有promises的数组,然后您就可以顺利地执行searchRequestBuilder
了。
https://stackoverflow.com/questions/69003527
复制相似问题