2016-06-02 4 views
1

Wenn Sie eine Funktion haben, die nichts erwartet und ein Versprechen zurückgibt, können Sie dies tun. Dies wird ein Versprechen, dass Sie await zurückgeben können.Gibt es einen Vorteil, eine Funktion async zu machen, wenn sie ein Versprechen zurückgibt?

function doSomethingAamzing ({id, animalType, accessToken}) { 
    const url = `${url}/v1/${animalType}/${id}?access_token=${accessToken}` 
    return request.get(url) 
} 

Es ist nicht notwendig, aber wir können dies tun.

async function doSomethingAamzing ({id, animalType, accessToken}) { 
    const url = `${url}/v1/${animalType}/${id}?access_token=${accessToken}` 
    return await request.get(url) 
} 

Im letzteren ist einfacher als Entwickler zu lesen, dass die Funktion Asynchron ist und ein Versprechen zurückkehren, die in der ersten Funktion ist nicht ganz klar. Der einzige Grund, warum ich denken könnte, dass es besser ist, letztere zu verwenden, ist, wenn der Code einer statischen Codeanalyse unterzogen wurde, die von der expliziten Syntax profitieren könnte.

Gibt es einen Vorteil, eine Funktion async zu machen, wenn sie ein Versprechen zurückgibt?

Antwort

2

Der Unterschied ist von außen nicht wahrnehmbar (es sei denn, Sie erhalten die Funktionsquelle über toString, die sowieso nicht von aktuellen transpilers unterstützt wird), also gibt es hier keinen Vorteil.

Die Funktion async könnte sogar ein wenig langsamer werden, weil der Aufruf mehr Dinge beinhaltet, ein neues Versprechen erstellt und gelöst wird.

Der große Vorteil von async Funktionen, abgesehen von der erhöhten Wartbarkeit, die Sie bereits erwähnt haben, ist die Fehlerbehandlung. Alle Ausnahmen, die bei der Auswertung des Funktionskörpers ausgelöst werden, werden in eine Ablehnung des zurückgegebenen Versprechens umgewandelt, ohne dass dies explizit erwähnt werden muss.

Hinweis Sie brauchen nicht einmal await hier verwenden, können Sie return thenables direkt von async function s:

async function doSomethingAamzing ({id, animalType, accessToken}) { 
    const url = `${url}/v1/${animalType}/${id}?access_token=${accessToken}` 
    return request.get(url) 
} 

1: es sei denn, Sie return ing in einem try Block sind, wo es does make a difference.

Verwandte Themen