Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Waiting for promise to resolve from parent function

I have a primary thread in my node application such as this:

function main_thread() {
  console.log("Starting");
  values = get_values(1);
  console.log(values);
  console.log("I expect to be after the values");
}

The get_values function calls the hgetall function using the node_redis package. This function provides a call back, but can be promisified:

function get_values(customer_id) {
  // Uses a callback for result
  new Promise(function(resolve, reject) {
    redis_client.hgetall(customer_id, function (err, result) {
    if (err) console.log(err)
      console.log("About to resolve");
      resolve(result);
    });
  })
  .then(({result}) => {
    console.log(result);
  });
}

This works great for promise chaining within the function, however not so well in my main thread, as I can't wait and return the value.

Here's how I'd do it in ruby, the main language I use:

def get_values(customer_id)
  return @redis_client.hgetall(customer_id)
end

How can I create a promise within a reusable function and make the main thread wait until the function returns the response from the promise?

EDIT:

It's been suggested the promise can be returned with a then chained in the main thread. However this still means any code in the main thread after after the function call executes before the then block.

EDIT 2:

After lengthy discussion with some IRL JS developer friends, it looks like trying to create a synchronous script is against the ethos of modern JS. I'm going to go back to my application design and work on making it async.

like image 601
Andrew White Avatar asked Jan 25 '26 15:01

Andrew White


1 Answers

Here is a working example with async/await. I've replaced the redis with a timeout and an array for the data.

async function main_thread() {
  console.log("Starting");
  values = await get_values(1);
  console.log(`After await: ${values}`);
  console.log("I expect to be after the values");
}

async function get_values(customer_id) {
  return new Promise((resolve, reject) => {
      setTimeout(() => {
        const result = [1, 2, 3];
        console.log(`Resolving: ${result}`);
        resolve(result);
      }, 300);
  });
}

main_thread();

Further reading:

  • Using Promises
  • Promise Constructor
like image 110
crashmstr Avatar answered Jan 28 '26 06:01

crashmstr



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!