2016-06-04 3 views
0
나는,이 중첩 콜백을 방지하기 위해 약속을 사용하는 몇 가지 코드를 리팩토링하는 데 문제

은 내가 리팩토링 노력하고있어 코드는 다음과 같습니다중첩 약속의 결과를 처리하는 방법

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을 사용하고, 약속을위한 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 날 약속의 배열로부터 결과를 얻을 수 있습니다 ... 그러나, 나는이 코드에서 오류를 받고 있어요 : TypeError: this.task.bot.reply is not a function 나는 전혀 도움이되지 못합니다.

내가하려는 일을 성취하기 위해 어떻게 약속을 사용할 수 있습니까?

답변

2

Promise.all 날

Promise.all 당신이 그것을이 충족 전달 한 번에 모든 약속을 성취됩니다 약속을 반환 약속의 배열에서 결과를 얻을 수 있습니다. 그러면 then을 호출하면됩니다.

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