Обещать.все.)(тогда() решить?
С Помощью Узла 4.х. Когда у вас есть Promise.all(promises).then()
Как правильно разрешить данные и передать их следующему .then()
?
Я хочу сделать что-то вроде этого:
Promise.all(promises).then(function(data){
// Do something with the data here
}).then(function(data){
// Do more stuff here
});
но я не уверен, как получить данные для 2-й .then()
. Я не могу использовать resolve(...)
в первом .then()
. Я понял, что могу сделать это:
return Promise.all(promises).then(function(data){
// Do something with the data here
return data;
}).then(function(data){
// Do more stuff here
});
но это не кажется правильным способом сделать это... Каков правильный подход к этому?
1 ответ:
но это не кажется правильным способом сделать это..
это действительно правильный способ сделать это (или по крайней мере a правильный способ сделать это). Это ключевой аспект обещаний, они являются конвейером, и данные могут быть массированы различными обработчиками в конвейере.
пример:
const promises = [ new Promise(resolve => setTimeout(resolve, 0, 1)), new Promise(resolve => setTimeout(resolve, 0, 2)) ]; Promise.all(promises) .then(data => { console.log("First handler", data); return data.map(entry => entry * 10); }) .then(data => { console.log("Second handler", data); });
(
catch
обработчик опущен для краткости. В производственном коде,всегда либо распространяйте обещание или обрабатывайте отказ.)вывод, который мы видим из этого:
First handler [1,2] Second handler [10,20]...потому что первый обработчик получает разрешение двух обещаний (
1
и2
) в виде массива, а затем создает новый массив с каждым из них умножается на 10 и возвращает его. Второй обработчик получает то, что возвратил первый обработчик.если дополнительная работа, которую вы делаете синхронно, вы также можете поставить его на первый обработчик:
пример:
const promises = [ new Promise(resolve => setTimeout(resolve, 0, 1)), new Promise(resolve => setTimeout(resolve, 0, 2)) ]; Promise.all(promises) .then(data => { console.log("Initial data", data); data = data.map(entry => entry * 10); console.log("Updated data", data); return data; });
...но если он асинхронный, вы не захотите этого делать, так как он становится вложенным, и вложение может быстро выйти из-под контроля.