展平Promise地图

Far*_*our 5 promise bluebird

我很好奇你是如何在承诺数组的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]);
  });
});
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 14

我们没有flatMap蓝鸟,.reduce如果您愿意,可以将结果连接起来:

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

虽然lodash flatten也可以用作:

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

也可以教蓝鸟这样做(如果你是图书馆作者 - 看看如何获​​得一个没有碰撞的新副本):

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);
});
Run Code Online (Sandbox Code Playgroud)

哪个会让你这样做:

return Promise.flatMap(list, function(){
     return Promise.resolve([1, 2, 3]);
});
Run Code Online (Sandbox Code Playgroud)