2016-01-08 15 views
6
'use strict'; 

Promise.resolve(() => 'John') 
    .then((args) => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch((ex) => { 
    console.log(ex) 
    }) 
    .then(() => { 
    throw new Error('ups') 
    console.log('Doe') 
    }) 

myślę console.log(args); powinien wypisać 'John', ale kiedy uruchomić ten kod, wyjście jest [ [Function] ]Jak rozumieć ten kod obietnicy?

Więc jestem zdezorientowany.

+2

Myślę, że wyjście powinno być john, ale zamiast tego jest to "[funkcja]' - 'console.log (() => 'john'))' - zobacz co tam zrobiłem? –

+0

'console.log (args());' wypisze * john * – cgTag

Odpowiedz

4

Promise.resolve utworzy nową Obietnicę rozwiązaną z wartością, którą do niej podasz. Tak więc w twoim przypadku twoja obietnica jest faktycznie rozwiązana za pomocą obiektu funkcji. Oznacza to, że program obsługi then jest przekazywany do obiektu funkcji.

Co należy zrobić jest

new Promise((resolve, reject) => resolve('John')) 
    .then(args => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch(console.log.bind(console)); 

Teraz tworzysz Promise obiekt i masz rozwiązanie, że przy wartości John.


Jeśli chcesz obietnicy zostać rozwiązane o wartości łatwo, to nie przekazać obiekt funkcyjny ale przekazać wartość rzeczywistą sama do Promise.resolve funkcji.

Promise.resolve('John') 
    .then(args => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch(console.log.bind(console)); 

Teraz masz obietnicę rozwiązany z wartością John i obsługi then dostanie rozwiązany wartość John.

Uwaga: Jest to zalecany sposób tworzenia obietnicę, gdy wiesz, rzeczywisty sposób rozwiązywać z łatwością, dzięki czemu można uniknąć Promise constructor anti-pattern.

+0

Alternatywnie: 'Promise.resolve(). Then then (() =>" John ") .then ((args) => console.log (argumenty) ... ' – aaaidan

+0

@aaaidan Nie można wywołać konstruktora' Promise', nie przekazując mu obiektu funkcji: – thefourtheye

+1

@thefourtheye '(args) =>' i '(ex) =>' można zredukować do 'args => 'n' ex => ' – mido

1

postanowienie służy do przekazywania argumentów bezpośrednio do ówczesnego obsługi

jeśli chcesz „John”, trzeba wywołać funkcję anonimową w rozmowy w celu rozwiązania()

Promise.resolve(function(){return 'John';}()); 

zawiadomienie wywołanie funkcji }().

+0

A czym różni się to od' Promise.resolve (' John ') '? –

+0

Oczywiście nie ma to wpływu na wynik przekazany do" wtedy ", jednak jestem pewien, że jest oczywiste, że mamy bezużyteczne wywołanie funkcji, które przeszkadza. on, kiedy OP widzi [Funkcję]. – activedecay

3
'use strict'; 

Promise.resolve('John') 
    .then((args) => { 
    console.log(args); 
    throw new Error('ops') 
    }) 
    .catch((ex) => { 
    console.log(ex) 
    }) 
    .then(() => { 
    throw new Error('ups') 
    console.log('Doe') 
    }) 

Modyfikuję Promise.resolve('John'), to działa. Patrz: Promise.resolve.