8
votes

I'm trying to use await on an anonymous function here are the results :

This is the way that works

async function hello(){
    return "hello";
}
let x = await hello();
console.log(x);

result :

"Hello"

This is the way i want it to work :

let x = await async function() {return "hello"};
console.log(x);

result :

[AsyncFunction]

What am i missing ? I'm new to promises.

EDIT : I tried adding the () after the anonymous function to call it. Here is the example with the actual Async code :

let invitationFound = await (async function (invitationToken, email){
    return models.usersModel.findOneInvitationByToken(invitationToken, email)
        .then(invitationFound => {

            return  invitationFound;
        })
        .catch(err =>{
           console.log(err);
        });
})();

console.log(invitationFound);
return res.status(200).json({"oki " : invitationFound});

Result of the console.log :

ServerResponse { domain: null, _events: { finish: [Function: bound resOnFinish] }, _eventsCount: 1, _maxListeners: undefined, output: [], outputEncodings: [], .....

Result of the res.code..

handledPromiseRejectionWarning: TypeError: Converting circular structure to JSON

I don't think the error come from models.usersModel.findOneInvitationByToken because it works fine when i use it in the first case

let userFound = await test(invitationToken, email);

EDIT 2 :

I found out the second problem ! I forgot to put the parameters into the parenthesis

let invitationFound = await (async function (invitationToken, email){
    return models.usersModel.findOneInvitationByToken(invitationToken, email)
        .then(invitationFound => {

            return  invitationFound;
        })
        .catch(err =>{
           console.log(err);
        });
})(invitationToken, email);

console.log(invitationFound);
return res.status(200).json({"oki " : invitationFound});

result :

{ oki : {mydata} }

2
Why are you using async/await on a synchronous function?Andrew Li
In the second snippet, you're just declaring the function but you don't call it.Nir Alfasi
@alfasin how do i call it on the same line ?Bidoubiwa
I'd suggest a separate question to go into these unrelated issues or starting a chat session if you need interactive debugging help. Hopefully your question on awaiting an anonymous function is answered.Jacob
I thought there'd be an easier way to do it, but maybe we just need to link to a chat room?! chat.stackoverflow.com/rooms/17/javascriptJacob

2 Answers

22
votes

You await Promises, which are returned from async functions, not the async function itself. Just add a call:

let x = await (async function() {return "hello"})();
console.log(x);
// or
console.log(await (async() => 'hello')())
3
votes

You are not calling a function in the second case:

let x = await hello();

This is how you are accessing it in the first case but in the second case, you are just you are adding await to a function declaration. It is just returning function, you need to change it to

let x = await (async function() {return "hello"})();
console.log(x);