2017-02-11 12 views
5

natknąłem się następującym sposobem ES6 podczas rewiew:Jaka jest poprawna składnia metody zadeklarowanej jako asynchroniczna?

async getUsers(res) { 
    User.findAll().then(users => res.json(users)); 
} 

Wydaje mi buggy. Liczyłam, co następuje:

async getUsers(res) { 
    return User.findAll().then(users => res.json(users)); 
} 

Ale wiem, że asynchroniczny ma wiele sztuczek, takich jak obietnice automatycznego zawijania, więc to moja intuicja jest prawidłowy?

+0

'async' nie jest ES6, jest to ES7 – smnbbrv

+1

Co to jest" res "? Btw, jeśli nie ma żadnych "oczekujących" - w ogóle nie potrzebujesz 'async'. – zerkms

+0

@zerkms Prawdopodobnie ekspresowy obiekt odpowiedzi: –

Odpowiedz

2

Kod w stanie, w jakim został napisany (bez numeru return), jest prawdopodobnie w porządku, o ile osoba dzwoniąca nie potrzebuje dostępu do asynchronicznie pobranej wartości.

Po pierwsze, async jest potrzebny jako część definicji funkcji TYLKO jeśli planujesz używać await wewnątrz funkcji. Jeśli nie używasz wewnątrz (którego twój kod nie pokazuje) await, część definicji definicji async nie jest potrzebna. Tak, to może być tylko to prawdopodobnie:

getUsers(res) { 
    User.findAll().then(users => res.json(users)); 
} 

Po drugie, jeśli rozmówca chce wykorzystać await funkcję getUsers(), to musi powrócić obietnicę (jak proponowane). Jeśli osoba dzwoniąca nie użyje w tym celu numeru await lub w inny sposób nie potrzebuje dostępu do wartości zwracanej, wówczas return nie jest konieczne. Tak więc, jeśli chcesz skorzystać await na tej funkcji, to prawdopodobnie powinien być tak:

getUsers(res) { 
    // return promise so caller can get async value 
    return User.findAll().then(users => { 
     res.json(users); 
     return users;  // return value so caller can get access to the value 
    }); 
} 

tak, oryginalny kod może być po prostu w porządku tak długo, jak rozmówca nie spodziewa asynchronicznego wartości zwracanej z tej funkcji (co jest możliwe tutaj, ponieważ wynik operacji asynchronicznej jest wysyłany z res.json() i może to być jedyny wynik, który jest potrzebny.) O ile oczekujemy/asynchronicznie, zwracamy tylko obietnicę z funkcji, które planujesz zastosowanie czekają na


Reasumując:.

  1. async jest potrzebny tylko wtedy, gdy planujesz używać await wewnątrz funkcji. Twoja funkcja prawdopodobnie nie wymaga nawet słowa kluczowego async.
  2. Zwrócona obietnica jest wymagana tylko wtedy, gdy osoba dzwoniąca chce uzyskać dostęp do odpowiedzi asynchronicznej za pośrednictwem tradycyjnej wersji f().then() lub przez let x = await f().
  3. Dzwoniący może await funkcja, która nie jest oznaczona jako async. await otrzyma wartość zwracaną z funkcji, a jeśli wartość zwracana nie jest obietnicą, zawinie ją w rozwiązanej obietnicy. Jeśli jest to obietnica, będzie czekać na rozwiązanie.

FYI, to bardzo dobry, krótki i słodki review of async/await i jak one wchodzą w interakcje z obietnicami.

+0

Bardzo ładna odpowiedź. Dlatego właśnie ten kod jest pełen ras. –

Powiązane problemy