function boo() { throw new Error(); } let foo = await boo(); Espero que arroje como si no hubiera la expresión de await . (Tenga en cuenta que boo no es una función asíncrona). Sin embargo, no encuentro una descripción del comportamiento de este código en la especificación ECMAScript.
Así es como se debe ejecutar la expresión de espera:
AwaitExpression : await UnaryExpression 1. Let exprRef be the result of evaluating UnaryExpression. 2. Let value be ? GetValue(exprRef). 3. Return ? Await(value). GetValue da como resultado una finalización abrupta, por lo que la rutina Await lo obtiene como argumento.
Es el lugar donde las cosas se vuelven poco claras para mí. Await envuelve el value en una promesa. Se logra con la ayuda del procedimiento PromiseResolve , que resuelve la promesa con value .
Entonces, ¿debería establecerse foo en una instancia de Error lanzado desde boo ? Por supuesto que es una tontería. Pero estoy atado en nudos y no puedo encontrar otra forma en la especificación.
GetValueda como resultado una finalización abrupta, por lo que la rutinaAwaitlo obtiene como argumento.
No, la operación abstracta Await nunca se ejecuta. Te estás perdiendo el (sutil) ? firme delante de ?GetValue(exprRef) , que es una forma abreviada de ReturnIfAbrupt :
2. Sea el valor ReturnIfAbrupt (GetValue(exprRef))
por lo tanto, si hay una finalización abrupta, simplemente finalizará la evaluación de la await y devolverá la finalización abrupta a la evaluación de la expresión de asignación.