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() 随心所欲。

http://bluebirdjs.com