NodeJS:链在承诺中自动运行?
NodeJS: Chain functions automatically in a promise?
我目前正在从 API 中获取数据,我需要执行多个 GET 请求(使用 axios)。在所有这些 GET 请求完成后,我 return 一个已解决的承诺。
但是,我需要根据数组列表自动执行这些 GET 请求:
function do_api_get_requests() {
return promise = new Promise(function(resolve, reject) {
API_IDs = [0, 1, 2];
axios.get('https://my.api.com/' + API_IDs[0])
.then(data => {
// Do something with data
axios.get('https://my.api.com/' + API_IDs[1])
.then(data => {
// Do something with data
axios.get('https://my.api.com/' + API_IDs[2])
.then(data => {
// Do something with data
// Finished, resolve
resolve("success");
}
}
}
}
}
这可行,但问题是 API_IDs 并不总是同一个数组,它会改变。所以我不确定如何自动链接这些请求。
既然你说它可能是一个可变长度数组并且你显示了请求的排序,你可以使用 async/await:
循环遍历数组
async function do_api_get_requests(API_IDS) {
for (let id of API_IDS) {
const data = await axios.get(`https://my.api.com/${id}`);
// do something with data here
}
return "success";
}
而且,既然你说 API ids 的列表是可变的,我把它作为一个参数,你可以传递给函数。
如果您想 运行 并行处理所有 API 请求(这对于小型阵列可能没问题,但对于大型阵列可能会很麻烦)并且您不需要运行 它们按特定顺序排列,您可以这样做:
function do_api_get_requests(API_IDS) {
return Promise.all(API_IDS.map(async (id) => {
const data = await axios.get(`https://my.api.com/${id}`);
// do something with data here for this request
})).then(() => {
// make resolved value be "success"
return "success";
});
}
根据您的情况,您也可以使用 Promise.allSettled()
。由于您没有显示返回结果,因此不清楚这是否有用。
您可以使用Promise.all()
方法同时处理所有API个请求,并在所有请求都解决后才解决。
function do_api_get_requests() {
const API_IDs = [0, 1, 2];
let promises = [];
for (const id of API_IDS) {
promises.push(axios.get(`https://my.api.com/${id}`));
}
return Promise.all(promises);
}
如果你使用Bluebird.js(一个更好的promise库,而且比in-builtPromise
更快),你可以使用Promise.each()
,Promise.mapSeries()
,或 Promisme.reduce()
随心所欲。
我目前正在从 API 中获取数据,我需要执行多个 GET 请求(使用 axios)。在所有这些 GET 请求完成后,我 return 一个已解决的承诺。
但是,我需要根据数组列表自动执行这些 GET 请求:
function do_api_get_requests() {
return promise = new Promise(function(resolve, reject) {
API_IDs = [0, 1, 2];
axios.get('https://my.api.com/' + API_IDs[0])
.then(data => {
// Do something with data
axios.get('https://my.api.com/' + API_IDs[1])
.then(data => {
// Do something with data
axios.get('https://my.api.com/' + API_IDs[2])
.then(data => {
// Do something with data
// Finished, resolve
resolve("success");
}
}
}
}
}
这可行,但问题是 API_IDs 并不总是同一个数组,它会改变。所以我不确定如何自动链接这些请求。
既然你说它可能是一个可变长度数组并且你显示了请求的排序,你可以使用 async/await:
循环遍历数组async function do_api_get_requests(API_IDS) {
for (let id of API_IDS) {
const data = await axios.get(`https://my.api.com/${id}`);
// do something with data here
}
return "success";
}
而且,既然你说 API ids 的列表是可变的,我把它作为一个参数,你可以传递给函数。
如果您想 运行 并行处理所有 API 请求(这对于小型阵列可能没问题,但对于大型阵列可能会很麻烦)并且您不需要运行 它们按特定顺序排列,您可以这样做:
function do_api_get_requests(API_IDS) {
return Promise.all(API_IDS.map(async (id) => {
const data = await axios.get(`https://my.api.com/${id}`);
// do something with data here for this request
})).then(() => {
// make resolved value be "success"
return "success";
});
}
根据您的情况,您也可以使用 Promise.allSettled()
。由于您没有显示返回结果,因此不清楚这是否有用。
您可以使用Promise.all()
方法同时处理所有API个请求,并在所有请求都解决后才解决。
function do_api_get_requests() {
const API_IDs = [0, 1, 2];
let promises = [];
for (const id of API_IDS) {
promises.push(axios.get(`https://my.api.com/${id}`));
}
return Promise.all(promises);
}
如果你使用Bluebird.js(一个更好的promise库,而且比in-builtPromise
更快),你可以使用Promise.each()
,Promise.mapSeries()
,或 Promisme.reduce()
随心所欲。