deno_lint icon indicating copy to clipboard operation
deno_lint copied to clipboard

Rule against `await await`

Open not-my-profile opened this issue 1 year ago • 15 comments

While the number of await keywords can affect which promise job is executed first (because promise jobs have to be enqued even if the promise is fulfilled), in sane code you usually only ever want one await keyword for one expression. And multiple await keywords are usually just an accident, so it would be nice to have a rule to detect this.

E.g. Invalid:

await await fetch('/test');

Valid:

await fetch('/test');

not-my-profile avatar Jun 16 '23 10:06 not-my-profile

Sounds reasonable, PRs are welcome

bartlomieju avatar Jun 16 '23 14:06 bartlomieju

Has anyone ever written this kind of code though? Is a rule worth it considering the extra time necessary to check for this condition? Perhaps there is precedence in other linters?

dsherret avatar Jul 14 '23 19:07 dsherret

It seems people write this kind of code: https://github.com/search?type=code&q=%22await+await+%22+language%3AJavaScript&l=JavaScript (maybe when coming from other languages like c# where this is necessary)

dsherret avatar Jul 14 '23 19:07 dsherret

I have written this code by accident ... you can easily end up with await await when copy'n'pasting code.

not-my-profile avatar Jul 14 '23 20:07 not-my-profile

Maybe deno fmt should just remove multiple awaits.

dsherret avatar Jul 14 '23 20:07 dsherret

As I explained in the issue description await await can result in different behavior than just await, so I think this change would be too dangerous for deno fmt, which I'd expect to never change the semantics of code.

not-my-profile avatar Jul 14 '23 20:07 not-my-profile

I'm surprised the tsc warning isn't shown in this case

'await' has no effect on the type of this expression. deno-ts(80007)

While the number of await keywords can affect which promise job is executed first

Does that really happen when awaiting a non-promise?

nayeemrmn avatar Jul 14 '23 20:07 nayeemrmn

I'm surprised the tsc warning isn't shown in this case

Oh, ... yeah me too. In case we get that warning to work then this lint is probably redundant.

Does that really happen when awaiting a non-promise?

Yes, according to the ECMAScript standard it even must happen.

not-my-profile avatar Jul 14 '23 20:07 not-my-profile

It does affect it, but I wouldn't consider it too dangerous. That said, considering it does change execution that's reasonable to not do it for formatting.

I'm surprised the tsc warning isn't shown in this case

image

Considering this is already handled by tsc, I think we should not add this to deno_lint. I'm going to close this issue.

dsherret avatar Jul 14 '23 20:07 dsherret

I guess we should open a new issue at denoland/deno about that tsc warning not being reported for await await fetch('/test');?

not-my-profile avatar Jul 14 '23 20:07 not-my-profile

I guess we should open a new issue at denoland/deno about that tsc warning not being reported for await await fetch('/test');?

It is reported as a warning in the editor.

image

dsherret avatar Jul 14 '23 20:07 dsherret

But not by deno check?

not-my-profile avatar Jul 14 '23 20:07 not-my-profile

image

Ah, seems to work inconsistently: image

nayeemrmn avatar Jul 14 '23 20:07 nayeemrmn

Oh yeah. Looks like typescript is only reporting this as a suggestion diagnostic, which we don't surface except in the editor. Perhaps it being reported via deno lint would still be good. I'm going to reopen.

dsherret avatar Jul 14 '23 20:07 dsherret

Slightly getting off-topic but would it make sense to add a deno check flag to also report suggestion diagnostics? Although it seems like the tsc CLI doesn't have such a flag.

not-my-profile avatar Jul 14 '23 20:07 not-my-profile