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 )
- Laissez
asyncContext
être le contexte d'exécution en cours d'exécution.- Laissez
promiseCapability
être! NewPromiseCapability(%Promise%)
! NewPromiseCapability(%Promise%)
.- 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.