簡體   English   中英

如何處理嵌套承諾的結果

[英]How to handle results of nested promises

我在重構某些代碼以使用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);
  });
});

我正在使用帶有松弛api的botkit和用於Promises的bluebird。

我最麻煩的部分是循環遍歷每個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允許我從一個promise數組中獲取結果...但是,我從以下代碼中得到了一個錯誤: TypeError: this.task.bot.reply is not a function ,不是根本無法幫助我。

我如何使用諾言來完成我想做的事情?

Promise.all可以讓我從一系列承諾中得到結果

Promise.all返回一個諾言,一旦您傳遞的所有諾言都兌現,該諾言就會實現。 所以,你需要做的是調用then就可以了

Promise.all(parsedUserIds(userIdsGroup).map(function(id) {/*return promise here*/}))
.then(function(results) { console.log(results); })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM