0

I want to know if there is a way to write a function that can execute any type of function whether it's async or not. I want to make sure to get the return value or if some error occurred while execution.

  • I think you'll have to give us a more concreate description of what you're trying to do. You call a function the same whether it's asynchronous or not. Extracting the return value from an asynchronous function depends entirely upon how the function is written. It needs to either accept a callback that will be called upon completion or error or it needs to return a promise that will resolve with the final value upon success and reject upon error. – jfriend00 Sep 22 '21 at 08:46
  • https://stackoverflow.com/a/27760489/457268 – k0pernikus Sep 22 '21 at 09:18
  • Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it's hard to tell exactly what you're asking. – Community Sep 29 '21 at 17:17
  • I have an object that contains properties that are functions. like a router for instance that executes handlers. I don't know what type of a function I'm getting but I don't want my app to crash if something goes wrong while executing. bear in mind that I'm not using express just vanilla JS. if there's a setTimeout in that function that throws an error I can't catch it even while wrapping the caller function in try/catch and my app crashes. – cacuto hana Sep 30 '21 at 09:15

1 Answers1

0

You can pass the function to an async function and have it wait for completion.

async function exec(myFunc, args = []) {
    return await myFunc(...args);
}
function myExampleAddFunction(a, b) {
    return new Promise((resolve, reject) => {
        console.log('Hello');
        resolve(a + b);
  });
}

const result = await exec(myExampleAddFunction, [1, 2]);

args is an optional parameter where you can pass your function's arguments as an array.

This will work irrespective of whether the function returns a value or a promise.

Mythos
  • 1,378
  • 1
  • 8
  • 21