如何将等待数据转换为单个数组?
How to convert await data into single array?
我有这段代码,我想把它放在一个数组中。
数据产生的输出是这样的:
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,但它仍然没有合并到一个数组中。我错过了什么?
您可以尝试使用 .concat
:
let allData = [];
allData = allData.concat(await data);
主要问题可能是您正在为元素数组的每个项目进行新调用。这可能会产生性能问题。最佳做法可能是只执行一次异步调用,然后获取所有项目。
无论如何,如果出于某种原因您确实需要进行所有这些 ajax 调用。认为您正在使用异步代码,那么您真的不知道所有调用何时得到响应。要解决此问题,您需要在完成所有调用后调用您的 searchRequestBuilder。
我建议你使用Promise.all方法。
I left you this link 向您展示它是如何工作的。基本上你需要做的是将所有 axios.post
promises 保存在一个数组中,然后循环你的元素数组调用 Promises.all
传递数组和你的 promises,然后你就可以执行你的 searchRequestBuilder
没问题。
因此,由于您的 .map 函数将 return 一个承诺数组,您可以将其存储在一个变量中,并且可以使用 Promise.all 或 Promise.allSettled 等待所有apis 来解析,您可以按照请求的顺序将所有结果放在一个数组中。
不是问题的一部分,另一件事是如果你不小心,并且在每个 api 请求上使用等待,它可以形成请求的瀑布模式,这意味着它将等待 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))
}
编辑:
此外,除此之外,我认为您不需要 return 地图功能中的新 Promise,如果您只是 return axios 它应该可以工作,因为 axios 本身会 return承诺。
我有这段代码,我想把它放在一个数组中。
数据产生的输出是这样的:
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,但它仍然没有合并到一个数组中。我错过了什么?
您可以尝试使用 .concat
:
let allData = [];
allData = allData.concat(await data);
主要问题可能是您正在为元素数组的每个项目进行新调用。这可能会产生性能问题。最佳做法可能是只执行一次异步调用,然后获取所有项目。
无论如何,如果出于某种原因您确实需要进行所有这些 ajax 调用。认为您正在使用异步代码,那么您真的不知道所有调用何时得到响应。要解决此问题,您需要在完成所有调用后调用您的 searchRequestBuilder。
我建议你使用Promise.all方法。
I left you this link 向您展示它是如何工作的。基本上你需要做的是将所有 axios.post
promises 保存在一个数组中,然后循环你的元素数组调用 Promises.all
传递数组和你的 promises,然后你就可以执行你的 searchRequestBuilder
没问题。
因此,由于您的 .map 函数将 return 一个承诺数组,您可以将其存储在一个变量中,并且可以使用 Promise.all 或 Promise.allSettled 等待所有apis 来解析,您可以按照请求的顺序将所有结果放在一个数组中。
不是问题的一部分,另一件事是如果你不小心,并且在每个 api 请求上使用等待,它可以形成请求的瀑布模式,这意味着它将等待 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))
}
编辑: 此外,除此之外,我认为您不需要 return 地图功能中的新 Promise,如果您只是 return axios 它应该可以工作,因为 axios 本身会 return承诺。