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() 工作。