2017-01-13 21 views
6

Czy to żadnej różnicy, jeśli mam:Javascript: Powrót obietnicę wewnątrz funkcji asynchronicznej

async function test() { 
    const foo = await bar() 
    return Promise.all([promise1, promise2]) 
} 

zamiast:

async function test() { 
    const foo = await bar() 
    const [result1, result2] = await Promise.all([promise1, promise2]) 
    // Given that I don't care about result1, result2 in this `test` function 
    return [result1, result2] 
} 

uzyskać ten sam wynik, jeśli zrobić albo. Na przykład. Mogę to zrobić w obu przypadkach:

test().then(([result1, result2]) => { ... }) 

, ale jestem bardziej ciekawy, jaki jest podstawowy mechanizm, w jaki sposób zachowują się tak samo.

Innymi słowy, jak działa funkcja asynchroniczna, jeśli wewnątrz funkcji zwracam obietnicę zamiast wartości?

Odpowiedz

0

Myślę, że wywołujesz funkcję synchroniczną (ta z await zmienia ją w funkcję, która zwraca wartość) w łańcuchu obietnicy.

z tego answer:

Jesteś doskonale swobodnie zadzwonić albo synchroniczne funkcji w łańcuchu obietnicy (od wewnątrz .Następnie() Ładowarki) lub asynchroniczne funkcje które następnie powrócić nową obietnicę.

Po zwróceniu czegoś z pliku.następnie() handler, możesz zwrócić albo wartość (która staje się wartością rozstrzygniętą obietnicy rodzica ) lub możesz zwrócić kolejną obietnicę (która łańcuchy na poprzednią obietnicę ) lub możesz rzucić, który działa jak zwracanie odrzucone obietnica (łańcuch obietnic zostaje odrzucony).

Druga sprawa to taka, w której domagają się synchroniczny metodę z test().then(...), co jest ważne.

+0

Dziękujemy za link! – BPm

2

Obie funkcje zwracają Promise.

const [result1, result2] = await Promise.all([promise1, promise2]) 
//HERE 
return [result1, result2] 

Tam, gdzie napisałem TUTAJ, można uzyskać dostęp do wyników1 i wyników2 var, które są wynikiem obietnic.

czekają jest alternatywą zadzwonić then na Promise i jego forma jest bardziej czytelny niż

Promise.all([promise1, promise2]).then(function(results){ 

}); 

Jeśli masz wiele żądań kolejno za pomocą czekają jest lepszym wyborem

var response1= await promise1 
var response2=await promise2 

przeciwko

promise1.then(function(){ 
    promise2.then(function(){ 
     promise3.then(function(){ 
     }) 
    }) 
}) 

EDYCJA

W pierwszej funkcji asynchroniczny kluczowe jest bezużyteczny, test funkcja zwróci obietnicę

Druga funkcja zwróci obietnica gdzie można zobaczyć słowa kluczowego czekają. Gdy oczekiwana obietnica zostanie rozwiązany wykonanie wewnątrz funkcji nadal i można uzyskać dostęp do skutkować obietnicy

EDIT 1

MaybeI zrozumieć, co znaczy słowo kluczowe asynchroniczny hermetyzacji swoją wartość powrotną do obietnicy, który jako rozstrzygnięta wartość, którą zwróciłeś

+0

Tak, rozumiem to. Jednakże, jeśli powiedzenie async zawsze zwraca obietnicę, oznacza to, że zawinie zwróconą obietnicę w ramach innej obietnicy? – BPm

+0

Promise.all utworzyć nową obietnicę, która będzie taka sama, że ​​powróci, czekać po prostu wstrzyma wykonywanie funkcji, aż wartość z obietnicy jest dostępna. –

+0

Myślę, że źle zrozumiałeś moje pytanie. Wiem o Promise.all i jak korzystać z funkcji asynchronicznych. Moje pytanie jest bardziej podobne: w pierwszym przypadku zwracam wartość, którą rozwiąże funkcja asynchroniczna. Co się dzieje w przypadku drugiego przypadku? – BPm

1

Myślę, że sposób w jaki funkcje asynchroniczne działają w odniesieniu do wartości zwracanej, polega na sprawdzeniu, czy ta wartość jest zawijana w obiekcie Obietnicy, a jeśli nie, robi to automatycznie. Jeśli wyraźnie zwrócisz obietnicę, funkcja nic z nią nie zrobi. Testowałem to przez powrocie nową obietnicę wewnątrz funkcji asynchronicznej:

async function test(){ 
var duration = resolveAfter(500) 
    return new Promise((resolve, reject) =>{}) 
} 

var neverresolved = test() 

Wynik neverresolved zawiera obietnicę, że zawsze jest w stanie oczekiwania, jak oczekiwano.

Powiązane problemy