2016-08-10 43 views
9

Mam taki kod ES7.Co powinno się stać z `czekaj`, gdy wyrażenie po słowie kluczowym nie ocenia się jako obiecujące?

async function returnsfive() { 
    var three = 3; 
    var threeP = await three; 
    return threeP+2; 
} 

returnsfive().then(k=>console.log(k), e=>console.error("err", e)) 

Co powinno się stać na linii var threeP = await three?

Kod powinien być kontynuowany zgodnie z oczekiwaniami lub nie, ponieważ three nie jest obietnicą?

W this repo jest on wymieniony jako "Składnia podlegająca debatom" & Semantyka ". Nie jestem w stanie przeczytać oficjalnej dokumentacji, aby znaleźć dokładną definicję, ponieważ jest ona zbyt techniczna.

Domyślne dzienniki transformacji babel.js 5 zgodnie z oczekiwaniami; jednak nodent - inna transformacja - drukuje TypeError: three.then is not a function. Co jest poprawne i dlaczego?

+2

'async/await' nie jest częścią ES7. To jest propozycja. –

+0

Oh. Dzięki za edytowanie tagów! –

Odpowiedz

5

Według current working draft spec, środowisko wykonawcze powinny "cast" z oczekiwaną wartość pierwszej obietnicy:

AsyncFunctionAwait (wartości)

  1. Niech asyncContext być uruchomiony kontekst wykonanie .
  2. Niech promiseCapability będzie ! NewPromiseCapability(%Promise%).
  3. Niech resolveResult będzie ! Call(promiseCapability.[[Resolve]], undefined, value).
  4. ...

Krok 2 i 3 połączone jest z grubsza równoważne wywołaniu Promise.resolve(value), który tworzy nową obietnicę, że zostanie rozwiązany przy danej wartości lub - jeżeli wartość jest thenable - będzie wynikać, że możliwe.

Innymi słowy: await 3 jest odpowiednikiem await Promise.resolve(3), a Babel implementuje specyfikację poprawnie.

Nodent z drugiej strony deliberately does not support awaiting a non-promise by default. Dostępna jest opcja wrapAwait, jeśli chcesz, aby wszystkie oczekiwane wartości były najpierw zapakowane w obietnicę, ale dokumentacja węzła informuje, że może to wpłynąć na wydajność.