链接承诺执行两项操作

时间:2016-07-15 03:54:55

标签: javascript node.js

我目前正在学习Node.js / JavaScript,以便使用Discordie库编写Discord bot。

我有两个单独的操作,一个创建对服务器的邀请,另一个踢用户,如果他们在其中一个消息中使用了slur,则向他们发送消息。

e.message.author.openDM().then(dm => dm.sendMessage(`You have been kicked from the **${e.message.guild.name}** server for using a slur. Please consider this a probation. When you feel that you are ready to not use that sort of language, feel free to rejoin us.`));
e.message.author.memberOf(e.message.guild).kick();

是我用来指导用户发送消息然后踢它们的方法。我有一个单独的命令(!invite),它生成一个邀请并从收到的json中提取邀请代码:

var generateInvite = e.message.channel.createInvite({"temporary": false, "xkcdpass": false});
generateInvite.then( function(res) { e.message.channel.sendMessage("https://discord.gg/" +res.code); });

我希望能够在直接消息代码中生成一个邀请,以便向被踢用户发送邀请,如果他们可以避免再次使用那种语言,那么我无法弄清楚如何正确地链接我的承诺:

generateInvite.then( function(res) { return res.code } ).then(e.message.author.openDM().then(function(dm){ dm.sendMessage(`You have been kicked from the **${e.message.guild.name}** server for using a slur. Please consider this a probation. When you feel that you are ready to not use that sort of language, feel free to rejoin us by following this link: https://discord.gg/` + res.code)}));

这个承诺链我哪里错了?

1 个答案:

答案 0 :(得分:1)

应该是

const author = e.message.author;
generateInvite.then( function(res) {
    author.openDM().then(function(dm){
        dm.sendMessage(`… link: https://discord.gg/${res.code}.`);
        author.memberOf(e.message.guild).kick();
    })
});

不要return res.code无处可去,也不要在回调的位置传递承诺(openDM().then(…))。

此外,您可能只想在向用户发送消息后踢出用户,因此请确保这两个操作已正确排序。

您也可以考虑并行创建邀请和打开dm频道,使用Promise.all等待两个承诺,然后在单个回调中使用它们的结果。