Обещать.все.)(тогда() решить?


С Помощью Узла 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 51

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;
  });

...но если он асинхронный, вы не захотите этого делать, так как он становится вложенным, и вложение может быстро выйти из-под контроля.