Que devrait-il arriver avec `await` lorsque l'expression après le mot-clé n'évalue pas pour promettre?

J'ai un code ES7 comme celui-ci.

async function returnsfive() { var three = 3; var threeP = await three; return threeP+2; } returnsfive().then(k=>console.log(k), e=>console.error("err", e)) 

Que se passera-t-il à la var threeP = await three lignes?

Le code devrait-il continuer comme prévu ou échouer, car three ne sont pas une promesse?

Dans ce compte , il est mentionné comme "Syntaxe et sémantique débiles". Je ne peux pas lire la documentation officielle pour trouver la définition exacte, car elle est trop technique.

Par défaut, les journaux de transformation de babel.js 5 sont attendus; Cependant, nodent – une transformation différente – imprime TypeError: three.then is not a function . Ce qui est correct et pourquoi?

Selon la spécification de projet de travail actuelle , le temps d'exécution devrait "lancer" la valeur attendue d'une promesse d'abord:

AsyncFunctionAwait ( valeur )

  1. Laissez asyncContext être le contexte d'exécution en cours d'exécution.
  2. Laissez promiseCapability être ! NewPromiseCapability(%Promise%) ! NewPromiseCapability(%Promise%) .
  3. Laissez resolveResult soit ! Call(promiseCapability.[[Resolve]], undefined, value) ! Call(promiseCapability.[[Resolve]], undefined, value) .

L'étape 2 et 3 combinée est à peu près équivalente à l'appel Promise.resolve(value) , ce qui crée une nouvelle promesse qui est résolue avec la valeur donnée ou – si la valeur est alors possible – suivra que possible.

En d'autres termes: await 3 est équivalent à await Promise.resolve(3) , et Babel implémente correctement la spécification.

Nodent en revanche délibérément ne supporte pas l'attente d'une promesse non prometteuse par défaut . Il y a une option wrapAwait disponible si vous souhaitez que toutes les valeurs attendues soient emballées dans une promesse d'abord, mais la documentation nodente indique que cela pourrait affecter les performances.