Abhijit Thakre
Abhijit Thakre

Reputation: 23

Regarding nested Promises in NodeJS

There are many threads on this and using that i am trying to find solution for below problem.

getMethod() {
  execDBQuery(sqlQuery1)
  .then(productionQueryRows => {
     prodResultFunc(resultSet) // Calling a function to get another set of DB values
     .then (result) {
      console.log(result) // Final result which will be sent to user
     }
  });
}

async function prodResultFunc(prodRowSet) {
 const results = await Promise.all(
    prodRowSet.map( async (objBatchRow) => {

        execDBQuery(sqlQuery2)
        .then(resultSet => {
            read value-1
        })

        execDBQuery(sqlQuery3)
        .then(resultSet => {
            read value-2
        })      

        // Create a object using Value-1 & Value-2 and return object to map
    });
  );
}

I tried implementing below (with one just SQL execution) and it works fine.

async function prodResultFunc(prodRowSet) {
 const results = await Promise.all(
    prodRowSet.map( async (objBatchRow) => {

        execDBQuery(sqlQuery2)
        .then(resultSet => {
            read values using resultSet
            Create object with resultSet values
        })
        return object
    });
  );
}

But i want use values for both SQLs (2 & 3) for creating object and this where i am struggling to find syntax for implementation. Any help/pointers to existing threads will be a great help.

Upvotes: 1

Views: 56

Answers (2)

Jaydip Jadhav
Jaydip Jadhav

Reputation: 12309

You might be looking for Promise.All

async function prodResultFunc(prodRowSet) {
 const results = await Promise.all(
    prodRowSet.map( async (objBatchRow) => {

          Promise.all([execDBQuery(sqlQuery2), execDBQuery(sqlQuery3)]).then(function(values) {
               //TODO:: Impement you business logic here
                console.log(values);
          });
    });
  );
}

Upvotes: 0

Terry Lennox
Terry Lennox

Reputation: 30725

Whenever you're dealing with complex Promise chains, I find that the async/await syntax is much easier to read. You end up with a lot less nested code.

The example below shows how you might combine the results of two different queries:

  
const prodRowSet = [1,2,3];

// Mock query function.
async function execDBQuery(sql) {
    return [{ id: 1, query: sql }];
}

async function prodResultFunc(prodRowSet) {
    const results = await Promise.all(
        prodRowSet.map( async (objBatchRow) => {

            let resultSet2 = await execDBQuery('sqlQuery2');
            let resultSet3 = await execDBQuery('sqlQuery3');

            // Do whatever you want to combine the result sets.
            let combinedObj = { resultSet2, resultSet3}
            return combinedObj;
        })
    );
    return results;
}

(async() => {
    let output = await prodResultFunc(prodRowSet);
    console.log("Output:", output);
})();

Upvotes: 1

Related Questions