2017-05-25 5 views
2

Warum muss await die äußere Funktion async lauten?JS async/await - warum erwartet async?

Zum Beispiel, warum braucht diese Mungo-Aussage die Funktion, die sie ist, um ein Versprechen zurückzugeben?

async function middleware(hostname, done) { 
    try { 
    let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec(); 
    done(null, team); 
    } catch (err) { done(err); } 
} 

ich die Laufzeit/Transpiler sehen die Lösung der Teams versprechen es Wert und async ist signalisiert es „wirft“ abgelehnt verspricht.

Aber versuchen/fangen "fängt" diese abgelehnten Versprechen, also warum sind async und erwarten so eng gekoppelt?

+0

Ich verstehe nicht, was Sie mit "* Aber versuchen/fangen" Fänge "diese abgelehnten Versprechen *". Wie ist das relevant für das Schlüsselwort async? – Bergi

+0

Mögliches Duplikat von [Warum ist das async-Schlüsselwort erforderlich] (https://stackoverflow.com/a/31485350/1048572)? – Bergi

+0

"* Warum braucht diese Mungo-Aussage die Funktion, die sie hat, um ein Versprechen abzugeben? *" - Wie könnte sie sonst auf das asynchrone Ergebnis der Mungo-Versprechung warten? – Bergi

Antwort

0

von https://stackoverflow.com/a/41744179/1483977 von @phaux Kopierte:

Diese Antworten geben alle gültigen Argumente dafür, warum die Asynchron-Schlüsselwort ist ein gute Sache, aber keiner von ihnen erwähnt tatsächlich der wahre Grund, warum es hatte zur Spezifikation hinzugefügt werden.

Der Grund dafür ist, dass diese

function await(x) { 
    return 'awaiting ' + x 
} 

function foo() { 
    return(await(42)) 
} 

Nach Ihrer Logik, würde foo() Rückkehr Promise{42} oder "awaiting 42" eine gültige JS pre-ES7 war? (Ein Versprechen der Rückkehr würde brechen rückwärts Kompatibilität)

Die Antwort ist also: await ist ein regulärer Bezeichner und es ist nur als Schlüsselwort innerhalb async Funktionen behandelt, so müssen sie markiert werden in gewisser Weise.

Fun Tatsache: die ursprüngliche Spezifikation vorgeschlagen leichter function^ foo() {} für asynchrone Syntax.

3

Ich bin nicht eingeweiht in die Design-Diskussionen JavaScript-Sprache, aber ich nehme an, es aus den gleichen Gründen ist die theC#languagerequiresasync (auch my blog sehen).

Nämlich:

  1. Rückwärtskompatibilität. Wenn await plötzlich überall ein neues Schlüsselwort wäre, würde jeder vorhandene Code, der await als Variablennamen verwendet, unterbrochen. Da await ein kontextbezogenes Schlüsselwort ist (aktiviert durch async), wird nur Code, der beabsichtigt, await als Schlüsselwort zu verwenden, await ein Schlüsselwort sein.
  2. Leichter zu analysieren. async macht es einfacher, asynchronen Code für Übersetzer, Browser, Tools und Menschen zu analysieren.