40

I have a node application that use some async functions.

How can i do for waiting the asynchronous function to complete before proceeding with the rest of the application flow?

Below there is a simple example.

var a = 0;
var b = 1;
a = a + b;

// this async function requires at least 30 sec
myAsyncFunction({}, function(data, err) {
    a = 5;
});

// TODO wait for async function

console.log(a); // it must be 5 and not 1
return a;

In the example, the element "a" to return must be 5 and not 1. It is equal to 1 if the application does not wait the async function.

Thanks

3
  • 4
    Great and useful comment Commented Nov 7, 2017 at 13:22
  • 3
    Yes, promises and async/await syntax sugar - as you suggested in the tags - are the way to go. Have you tried applying them to your problem? Please show your efforts. Commented Nov 7, 2017 at 13:29
  • Possible duplicate of How to return the response from an asynchronous call? Commented Nov 7, 2017 at 19:37

1 Answer 1

65

 Using callback mechanism:

function operation(callback) {

    var a = 0;
    var b = 1;
    a = a + b;
    a = 5;

    // may be a heavy db call or http request?
    // do not return any data, use callback mechanism
    callback(a)
}

operation(function(a /* a is passed using callback */) {
    console.log(a); // a is 5
})

 Using async await

async function operation() {
    return new Promise(function(resolve, reject) {
        var a = 0;
        var b = 1;
        a = a + b;
        a = 5;

        // may be a heavy db call or http request?
        resolve(a) // successfully fill promise
    })
}

async function app() {
    var a = await operation() // a is 5
}

app()
Sign up to request clarification or add additional context in comments.

3 Comments

I have been searching for a good explanation of Promise and finally found one! Thank you!
None of the two alternatives actually waits. In particular a returned by await is not 5. Instead it is a promise, which is just another way to require a callback. The right answer would be: you can not wait.
operation function doesn't need to have async before it, since its not using await. Its redundant since async makes it so that the function returns a promise, but operation() already is returning a promise.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.