Сведение карты Promise

Мне любопытно, как вы собираетесь сглаживать результаты карты промисов промисов, которые являются массивами. У меня есть функция, которая Promise.maps по набору значений, которые сами по себе являются обещаниями (требующими разрешения) и возвращающими массив. Итак, я возвращаю что-то вроде: [ [1, 2, 3], [1, 2, 3] и т. д.] Я использовал lodash/underscore ._flatten после, однако я уверен, что есть более чистый метод.

return Promise.map(list, function(item) {
  return new Promise(function(res, rej) {
    return res([1, 2, 3]);
  });
});

person Farhad Ghayour    schedule 12.06.2015    source источник


Ответы (1)


У нас нет flatMap в bluebird, вы можете .reduce, если хотите, чтобы объединить результаты:

return Promise.map(list, function(item) {
    return Promise.resolve([1, 2, 3]); // shorter than constructor
}).reduce(function(prev, cur){
    return prev.concat(cur);
}, []);

Хотя lodash flatten также будет работать как:

return Promise.map(list, function(item) {
    return Promise.resolve([1, 2, 3]); // shorter than constructor
}).then(_.flatten);

Также можно научить bluebird делать это (если вы автор библиотеки - посмотрите, как получить свежую копию без коллизий):

Promise.prototype.flatMap = function(mapper, options){
    return this.then(function(val){ 
         return Promise.map(mapper, options).then(_.flatten);
    });
});

Promise.flatMap = function(val, mapper, options){
    Promise.resolve(val).flatMap(mapper, options);
});

Что позволит вам сделать:

return Promise.flatMap(list, function(){
     return Promise.resolve([1, 2, 3]);
});
person Benjamin Gruenbaum    schedule 12.06.2015
comment
Спасибо за потрясающий ответ. Я никогда не использовал Promise.resolve таким образом (чисто!). Мне любопытно, когда вы захотите использовать конструктор вместо простой функции Promise.resolve? - person Farhad Ghayour; 12.06.2015
comment
@FarhadGhayour при преобразовании API-интерфейсов обратного вызова, которые нельзя преобразовать в обещания с автоматическим обещанием, и при написании функций агрегирования в очень конкретных случаях. Очень редко — в недавней совместной базе кода 100k LoC, в которой было много асинхронных вещей, мы ни разу не использовали ее. - person Benjamin Gruenbaum; 12.06.2015