展平 Promise 地图
Flattening a Promise map
我很好奇您如何将作为数组的 Promise 映射的结果展平。我有一个函数 Promise.maps 超过一组值,它们本身就是承诺(需要解决)并返回一个数组。所以,我得到类似的结果: [ [1, 2, 3], [1, 2, 3], etc. ] 我一直在使用 lodash/underscore ._flatten 之后,但是,我确定是一种更清洁的方法。
return Promise.map(list, function(item) {
return new Promise(function(res, rej) {
return res([1, 2, 3]);
});
});
我们在 bluebird 中没有 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);
}, []);
尽管 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]);
});
我很好奇您如何将作为数组的 Promise 映射的结果展平。我有一个函数 Promise.maps 超过一组值,它们本身就是承诺(需要解决)并返回一个数组。所以,我得到类似的结果: [ [1, 2, 3], [1, 2, 3], etc. ] 我一直在使用 lodash/underscore ._flatten 之后,但是,我确定是一种更清洁的方法。
return Promise.map(list, function(item) {
return new Promise(function(res, rej) {
return res([1, 2, 3]);
});
});
我们在 bluebird 中没有 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);
}, []);
尽管 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]);
});