2017-06-19 11 views
5

Chcę przekazać bezpośrednio Promise.all do .then funkcji jak:Dlaczego przekazywanie bezpośrednio Promise.all do funkcji .then powoduje błąd?

const test = [ 
    Promise.resolve(), 
    Promise.resolve(), 
    Promise.resolve(), 
    Promise.resolve() 
]; 

Promise.resolve(test) // It's supposed to be an AJAX call 
.then(Promise.all) // Get an array of promises 
.then(console.log('End'); 

Ale ten kod generuje błąd Uncaught (in promise) TypeError: Promise.all called on non-object.

Kiedy usunąć składni skróconej, to działa:

Promise.resolve(test) 
.then(queries => Promise.all(queries)) 
.then(console.log('End')); 

Więc dlaczego Promise.all przekazywane bezpośrednio do .then zgłasza błąd? (I dlaczego console.log działa dobrze?)

Odpowiedz

4

Trzeba związać Promise.all.bind(Promise)

Od ES2015 spec:

all funkcja wymaga od tej wartości, aby być funkcją konstruktora, który obsługuje konwencje parametrów konstruktor Promise.

Albo lepiej użyj go bezpośrednio na tablicy.

const test = [ 
 
    Promise.resolve(1), 
 
    Promise.resolve(2), 
 
    Promise.resolve(3), 
 
    Promise.resolve(4) 
 
] 
 

 
Promise.resolve(test) 
 
    .then(Promise.all.bind(Promise)) 
 
    .then(x => console.log(x)) 
 
    
 
Promise.all(test) 
 
    .then(x => console.log(x))

+0

Dlaczego? (Nie mogę użyć go bezpośrednio na tablicy, ta tablica pochodzi z połączenia Ajax, będę aktualizować moje pytanie) – RChanaud

+0

@RChanaud [Spec] (https://tc39.github.io/ecma262/2017/#sec- obietnica.all) mówi tak: "Niech C będzie tą wartością." Jeśli Typ (C) nie jest Obiektem, wyrzuć wyjątek TypeError. " " Funkcja wymaga tej wartości, aby była funkcją konstruktora obsługującą konwencje parametrów konstruktora Promise." –

+2

@RChanaud Wątpię, czy twoja prośba o ajax przynosi magiczne obietnice. Więc wciąż istnieje miejsce, w którym tworzysz szereg obietnic wewnątrz callback 'then', dzięki czemu możesz zwrócić' Promise.all (obietnice) 'zamiast tablicy –

Powiązane problemy