I am using async
/await
in several places in my code.
For example, if I have this function:
async function func(x) {
...
return y;
}
Then I always call it as follows:
async function func2(x) {
let y = await func(x);
...
}
I have noticed that in some cases, I can omit the await
and the program will still run correctly, so I cannot quite figure out when I must use await
and when I can drop it.
I have concluded that it is "legitimate" to drop the await
only directly within a return statement.
For example:
async function func2(x) {
...
return func(x); // instead of return await func(x);
}
Is this conclusion correct, or else, what am I missing here?
EDIT:
A small (but important) notion that has not been mentioned in any of the answers below, which I have just encountered and realized:
It is NOT "legitimate" to drop the await
within a return
statement, if the called function may throw an exception, and that statement is therefore executed inside a try
block.
For example, removing the await
in the code below is "dangerous":
async function func1() {
try {
return await func2();
}
catch (error) {
return something_else;
}
}
The reason is that the try
block completes without an exception, and the Promise
object returns "normally". In any function which calls the outer function, however, when this Promise
object is "executed", the actual error will occur and an exception will be thrown. This exception will be handled successfully in the outer function only if await
is used. Otherwise, that responsibility goes up, where an additional try
/catch
clause will be required.