Promise.map 超过对象
Promise.map over object
我有一个对象;
{ '6': { stream: { twitch: [Object] } },
'7': { stream: { twitch: [Object] } },
'8': { stream: { twitch: [Object] } },
'9': { stream: { twitch: [Object] } },
'10': { stream: { twitch: [Object] } },
'11': { stream: { twitch: [Object] } } }
我想遍历它;
return Promise.map(myObj, function(minute, minuteIndex) {
所以基本上 minute 应该保存数据而 minuteIndex 应该保存索引。
我可以用 lodash 做,但 bluebird 做不到。
_.forEach(hour.minutes, function(minute, minuteIndex) {
我知道这段代码以前可以用,但现在不能用了。
有什么想法吗?
您可以将对象的键映射到数组中并将其提供给 Promise.map()
:
function process(stats) {
var statsArray = Object.keys(stats).map(key => ({
minute: key, minuteIndex: stats[key]
}));
return Promise.map(statsArray, item => {
// work with item.minute & item.minuteIndex
});
}
用法:
var twitchStats = {
'6': { stream: { twitch: [Object] } },
'7': { stream: { twitch: [Object] } },
'8': { stream: { twitch: [Object] } },
'9': { stream: { twitch: [Object] } },
'10': { stream: { twitch: [Object] } },
'11': { stream: { twitch: [Object] } }
};
process(twitchStats).then(result => {
// ...
});
您也可以使用_.toPairs将对象转换为数组,然后您应该可以使用Promise.map方法。
如果您正在使用 return 承诺或值的 Promise.map()
回调,则您没有在问题中指定。如果您只想 return 一个值,那么使用 Promise.map()
比 forEach
没有太多好处。
Bluebird 的 Promise.map()
用于其最基本的界面是根据文档:
to replace the .push+Promise.all boilerplate
假设您想要 return 承诺,您可以使用 lodash.map()
遍历对象并在 创建 承诺时使用密钥,然后使用 Promise.all()
执行它们。
let jobs =
_.map(myObj, (minute, minuteIndex) => {
return fnThatReturnsPromise(minute, minuteIndex);
});
return Promise.all(jobs);
或者作为更接近您所需格式的单个语句
return Promise.all(_.map(myObj, (minute, minuteIndex) => {
return fnThatReturnsPromise(minute, minuteIndex);
}));
Promise.all(
Object.keys(twitchStats).map(key => Promise.resolve({
minute: key, minuteIndex: twitchStats[key]
})
)
结合使用 Promise.all()
和 map()
函数。注意:map()
必须 return 承诺 才能 Promise.all()
工作。
我有一个对象;
{ '6': { stream: { twitch: [Object] } },
'7': { stream: { twitch: [Object] } },
'8': { stream: { twitch: [Object] } },
'9': { stream: { twitch: [Object] } },
'10': { stream: { twitch: [Object] } },
'11': { stream: { twitch: [Object] } } }
我想遍历它;
return Promise.map(myObj, function(minute, minuteIndex) {
所以基本上 minute 应该保存数据而 minuteIndex 应该保存索引。
我可以用 lodash 做,但 bluebird 做不到。
_.forEach(hour.minutes, function(minute, minuteIndex) {
我知道这段代码以前可以用,但现在不能用了。
有什么想法吗?
您可以将对象的键映射到数组中并将其提供给 Promise.map()
:
function process(stats) {
var statsArray = Object.keys(stats).map(key => ({
minute: key, minuteIndex: stats[key]
}));
return Promise.map(statsArray, item => {
// work with item.minute & item.minuteIndex
});
}
用法:
var twitchStats = {
'6': { stream: { twitch: [Object] } },
'7': { stream: { twitch: [Object] } },
'8': { stream: { twitch: [Object] } },
'9': { stream: { twitch: [Object] } },
'10': { stream: { twitch: [Object] } },
'11': { stream: { twitch: [Object] } }
};
process(twitchStats).then(result => {
// ...
});
您也可以使用_.toPairs将对象转换为数组,然后您应该可以使用Promise.map方法。
如果您正在使用 return 承诺或值的 Promise.map()
回调,则您没有在问题中指定。如果您只想 return 一个值,那么使用 Promise.map()
比 forEach
没有太多好处。
Bluebird 的 Promise.map()
用于其最基本的界面是根据文档:
to replace the .push+Promise.all boilerplate
假设您想要 return 承诺,您可以使用 lodash.map()
遍历对象并在 创建 承诺时使用密钥,然后使用 Promise.all()
执行它们。
let jobs =
_.map(myObj, (minute, minuteIndex) => {
return fnThatReturnsPromise(minute, minuteIndex);
});
return Promise.all(jobs);
或者作为更接近您所需格式的单个语句
return Promise.all(_.map(myObj, (minute, minuteIndex) => {
return fnThatReturnsPromise(minute, minuteIndex);
}));
Promise.all(
Object.keys(twitchStats).map(key => Promise.resolve({
minute: key, minuteIndex: twitchStats[key]
})
)
结合使用 Promise.all()
和 map()
函数。注意:map()
必须 return 承诺 才能 Promise.all()
工作。