javascriptnode.jspromisees6-promisechain

NodeJS: Chain functions automatically in a promise?


I'm currently fetching data from an API and I need to do multiple GET requests (using axios). After all those GET requests are completed, I return a resolved promise.

However, I need to do these GET requests automatically based on an array list:

    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");
                
              }


            }


          }

        }

    }

This works but the problem is API_IDs isn't always going to be the same array, it will change. So I'm not sure how to chain these requests automatically.


Solution

  • Since you said it may be a variable length array and you show sequencing the requests, you can just loop through the array using 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";
    }
    

    And, since you said the list of API ids would be variable, I made it a parameter that you can pass into the function.


    If you wanted to run all the API requests in parallel (which might be OK for a small array, but might be trouble for a large array) and you don't need to run them in a specific order, you can do this:

    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";
        });
    }
    

    Depending upon your circumstances, you could also use Promise.allSettled(). Since you don't show getting results back, it's not clear whether that would be useful or not.