javascript - 我怎么能把我的函数变成一个承诺,这样我就可以使用它了?
问题描述
我有一个为我提示用户的功能,但是,我需要让它成为一个承诺,这样我就可以在继续执行命令之前“等待”它的完成。
这是位于Prompt.js
文件中的函数
const Discord = require('discord.js')
const ms = require('ms')
module.exports = async function Prompt(originalMessage, textOrEmbed, {embedColor = 'GREEN', yesNo = false, channel = originalMessage.channel, filterArray = [], time = '5m'} = {}) {
if (typeof originalMessage !== "object")
throw new Error(`The provided message was not a message object.`)
if (typeof textOrEmbed === "object") {
textOrEmbed = textOrEmbed;
} else if (typeof textOrEmbed === "string") {
let embed = new Discord.MessageEmbed()
.setTitle(`Plus Prompt`)
.setDescription(textOrEmbed)
.setImage('https://theprogrammerof.tech/i/plusEmbedBackground.gif')
.setColor(embedColor)
.setFooter(`Interactive message prompt: Lasts ${time} Ran by ${originalMessage.author.username}`, originalMessage.author.avatarURL())
textOrEmbed = embed;
} else throw new Error('Provided textOrEmbed option was not a string or embed.')
channel.send(textOrEmbed)
let convertedTime = ms(time)
if (!convertedTime)
throw new Error('A prompt encountered an error: MS (package) was unable to convert the time you provided. An example time value is: "5m"')
let filter;
if (filterArray.length === 0) {
filter = m => {
return m.author.id === originalMessage.author.id;
}
} else {
filterArray.push('cancel')
let errorEmbed = new Discord.MessageEmbed()
.setTitle(`The current running prompt received an invalid input`)
.setDescription(`Proper responses to this prompt are: \`${filterArray.join(', ')}\``)
.setFooter(`Interactive message prompt: Lasts ${time} Error Ran by ${originalMessage.author.username}`, originalMessage.author.avatarURL())
filter = m => {
if (m.author.id === originalMessage.author.id && filterArray.includes(m.content.toLowerCase()))
return true;
else if (m.author.id === originalMessage.author.id && !filterArray.includes(m.content.toLowerCase())) {
originalMessage.channel.send(errorEmbed)
}
}
}
channel.awaitMessages(filter, { time: convertedTime, max: 1, errors: ['time']})
.then(collected => {
if (!collected) {
channel.send('Cancelled Prompt.')
return undefined;
}
if (collected.first().content.toLowerCase() === 'cancel') {
channel.send('Cancelled Prompt')
return undefined;
}
return collected.first();
})
.catch(error => {
channel.send('Cancelled prompt.')
return undefined;
})
}
在命令文件中,我希望代码在发送消息之前等待,以便 prompt.content() 可用。
test.js
const Discord = require('discord.js')
let Prompt = require('../functions/Prompt.js')
module.exports = {
name: 'test',
description: 'test',
enabled: true,
developer: true,
usage: 'test',
cat: 'e',
run: async (client, message, args, prefixUsed) => {
try {
let prompt = await Prompt(message, 'test') //Need this to await to I can prevent the message.channel.send from running before prompt.content is available
message.channel.send(`Collected ${prompt.content}`)
} catch (error) {
message.channel.send(` This command was prevented from executing by a code based issue. Please try again soon.`)
console.log(error)
}
}
};
我怎样才能将我刚刚做出的函数转换为一个承诺,以便我可以等待承诺解决?
作为一个长镜头,我尝试了下面的代码,但结果是相同的。
Prompt.js(2)
const Discord = require('discord.js')
const ms = require('ms')
module.exports = async function Prompt(originalMessage, textOrEmbed, {embedColor = 'GREEN', yesNo = false, channel = originalMessage.channel, filterArray = [], time = '5m'} = {}) {
new Promise((resolve, reject) => {
if (typeof originalMessage !== "object")
throw new Error(`The provided message was not a message object.`)
if (typeof textOrEmbed === "object") {
textOrEmbed = textOrEmbed;
} else if (typeof textOrEmbed === "string") {
let embed = new Discord.MessageEmbed()
.setTitle(`Plus Prompt`)
.setDescription(textOrEmbed)
.setImage('https://theprogrammerof.tech/i/plusEmbedBackground.gif')
.setColor(embedColor)
.setFooter(`Interactive message prompt: Lasts ${time} Ran by ${originalMessage.author.username}`, originalMessage.author.avatarURL())
textOrEmbed = embed;
} else throw new Error('Provided textOrEmbed option was not a string or embed.')
channel.send(textOrEmbed)
let convertedTime = ms(time)
if (!convertedTime)
throw new Error('A prompt encountered an error: MS (package) was unable to convert the time you provided. An example time value is: "5m"')
let filter;
if (filterArray.length === 0) {
filter = m => {
return m.author.id === originalMessage.author.id;
}
} else {
filterArray.push('cancel')
let errorEmbed = new Discord.MessageEmbed()
.setTitle(`The current running prompt received an invalid input`)
.setDescription(`Proper responses to this prompt are: \`${filterArray.join(', ')}\``)
.setFooter(`Interactive message prompt: Lasts ${time} Error Ran by ${originalMessage.author.username}`, originalMessage.author.avatarURL())
filter = m => {
if (m.author.id === originalMessage.author.id && filterArray.includes(m.content.toLowerCase()))
return true;
else if (m.author.id === originalMessage.author.id && !filterArray.includes(m.content.toLowerCase())) {
originalMessage.channel.send(errorEmbed)
}
}
}
channel.awaitMessages(filter, { time: convertedTime, max: 1, errors: ['time']})
.then(collected => {
if (!collected) {
channel.send('Cancelled Prompt.')
reject('Cancelled prompt.')
}
if (collected.first().content.toLowerCase() === 'cancel') {
channel.send('Cancelled Prompt')
reject('Cancelled prompt.')
}
resolve(collected.first())
})
.catch(error => {
channel.send('Cancelled prompt.')
reject('Cancelled prompt.')
})
})
}
如果有人可以提供帮助,那就太好了!谢谢!
解决方案
您需要new Promise(…)
从Prompt
.
推荐阅读
- matlab - 如何在Matlab中对具有给定容差的点进行分组
- c++ - 如何在 VS Code 上激活 C++ 的红色下划线?
- azure-active-directory - 将应用标记为已在 Azure AD B2C 中验证的发布者
- python - 在 QComboBox 上使用 QDataWidgetMapper 和 QStandardItemModel
- python - 为什么在 Matplotlib 中初始化一行时需要逗号?
- r - dplyr 按管道中的位置过滤向量 %>%
- include - 广告拦截器会读取包含语句吗?
- bootstrap-4 - 引导模式在移动设备中不可见
- javascript - 我的 NodeJs 给出了 unhandledPromise 的错误
- mysql - 如何将 to_timestamp 从 oracle 转换为 mysql 时间戳