首页 > 解决方案 > 我怎么能把我的函数变成一个承诺,这样我就可以使用它了?

问题描述

我有一个为我提示用户的功能,但是,我需要让它成为一个承诺,这样我就可以在继续执行命令之前“等待”它的完成。

这是位于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.')
            })

    })

}

如果有人可以提供帮助,那就太好了!谢谢!

标签: javascriptnode.jsdiscord.js

解决方案


您需要new Promise(…)Prompt.


推荐阅读