2016-02-26 28 views
5

Per esempio, perché la funzione qui sotto deve avere "asincrono" .. non sta usando l'attesa abbastanza specifica da consentire al compilatore di analizzare il codice senza ambiguità?Perché le funzioni javascript devono avere la parola chiave "async"? La parola chiave "Attendere" non è abbastanza?

# Why do we need async here 
async function foo() { 
    var user = await getUser(user_id); 
    console.log(user); 
} 

È per ragioni di compatibilità con le versioni precedenti? (Non riesco a pensare a nessun codice che usi la tastiera Attendi in Javascript standard ..)?

È soprattutto per chiarezza per chiarire che questa funzione utilizza la nuova parola chiave async? Grazie

+1

Posso solo immaginare che rende l'analisi più facile .... –

+1

In questo esempio, non avrebbe molto senso. Stai eseguendo qualcosa in modo asincrono e poi gli dici di attendere i risultati di getUser. Potrebbe avere più senso nel contesto di una funzione più ampia. – Neil

+0

Potresti trovare utile questo blog: https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html Sono d'accordo che probabilmente è un problema di analisi. Dal blog: "Quando una funzione viene dichiarata come asincrona, è in grado di fornire l'esecuzione al codice chiamante mentre attende la risoluzione di una promessa." – scrappedcola

risposta

6

Dal punto di vista delle lingue, i async/await parole chiave in JavaScript sono progettati molto da vicino al loro modo di lavorare in C#.

Ho un vecchio post sul blog che descrive alcune discussioni sul motivo per cui async è stato aggiunto esplicitamente in C#: see Inferring "async" here. In breve, l'aggiunta di parole chiave è una potenziale modifica alla lingua; immagina un'app esistente che utilizza uno var await = false; o qualcosa di simile.

Oppure, per un esempio di come ciò potrebbe essere più ambiguo, var await = function() {};, che verrebbe utilizzato come await (x);. Considerando l'utilizzo di await (x);, il compilatore avrebbe difficoltà a decidere quale tipo di espressione è. Potresti obiettare che await è una parola chiave a meno che non sia che ci sia una variabile con questo nome, ma che diventa molto pelosa.

Una soluzione più pulita è introdurre un paio di parole chiave, così async (utilizzato solo per le funzioni e lambda, e non è ambigua) abilita la parola await, ma solo in tale ambito. Ci sono vantaggi simili ad avere function* denotare generatori, piuttosto che la sola presenza di yield.

E 'non solo è meno ambigua (mantenendo la compatibilità con il codice che utilizza await per altre cose), ma è anche più facile sia per il software e gli esseri umani da analizzare.

Problemi correlati