0

Promises を使用するために一部のコードをリファクタリングするのに問題があります。これは、ネストされたコールバックを避けるためです。リファクタリングしようとしているコードは次のようになります。

bot.api.users.list({}, function(err, teamData) {
if(err) {
  bot.botkit.log("Couldn't fetch team data from API", err);
  return;
}

var members = teamData.members;
var msgSender = _.find(members, function(member) { return member.id == message.user });

parsedUserIds(userIdsGroup).forEach(function(id) {
  var msgReceiver = _.find(members, function(member) { return member.id == id });

  bot.startPrivateConversation({ user: id }, function(err, conversation) {
    if(err) {
      bot.botkit.log("Couldn't initiate private conversation", err);
      return;
    }

    var message = format("Hey {to}, {from} just requested a Pull Request Review, here's the link: {githubLink}, please go and check it out!", 
                         { to: msgReceiver.name,
                           from: msgSender.name,
                           githubLink: githubRepoUrl });

      conversation.say(message);
  });
});

私は botkit を slack api で使用し、bluebird を Promises で使用しています。

私が最も問題を抱えているコードの部分は、各 ID を反復処理し、ユーザーとのプライベートな会話を開始するループです。私が試してきたことは次のようになります:

  var usersList = Promise.promisify(bot.api.users.list);
  var privateConversation = Promise.promisify(bot.startPrivateConversation);

  usersList({}).then(function(data) {
    var members = data.members;
    var msgSender = findMember(members, message.user);

    return Promise.all(parsedUserIds(userIdsGroup).map(function(id) {
      var msgReceiver = findMember(members, id);

      return privateConversation({ user: id }).then(function(conversation) {
        var message = format("Hey {to}, {from} just requested a Pull Request Review, here's the link: {githubLink}, please go and check it out!", 
                             { to: msgReceiver.name,
                               from: msgSender.name,
                               githubLink: githubRepoUrl });
        conversation.say(message);
      });
    }));
  }).catch(function(err){
    bot.botkit.log(err);
  });

私が理解していることから、 Promise.all を使用すると、約束の配列から結果を取得できます...ただし、このコードからエラーが発生します。TypeError: this.task.bot.reply is not a functionこれはまったく役に立ちません。

やろうとしていることを達成するために promise を使用するにはどうすればよいですか?

4

1 に答える 1

2

Promise.all を使用すると、promise の配列から結果を取得できます

Promise.all は、渡したすべての Promise が満たされると満たされる Promise を返します。だからあなたがする必要があるのはそれを呼び出すthenことです

Promise.all(parsedUserIds(userIdsGroup).map(function(id) {/*return promise here*/}))
.then(function(results) { console.log(results); })
于 2016-06-04T07:48:04.527 に答える