javascript - 消息在需要所有数据之前发送,这意味着它发送了几条消息,所有消息中的数据都相同

标签 javascript node.js discord.js

我正在学习 Node js,并且希望代码在发送消息之前等待检索数据。现在看来它从页面获取了一些数据,然后使用它并发送具有相同数据的所有消息。有人可以帮助我吗?我真的很感激,提前谢谢。

const fetch = require("node-fetch");
const path = require("path");
const {
    RichEmbed
} = require("discord.js");
const {
    stripIndents
} = require("common-tags");
const {
    cyan
} = require("../../colours.json");
const fs = require("fs");

module.exports = {
    config: {
        name: "viewfavoritequotes",
        description: "Shows all your favorite quotes as individual messages.",
        accessableby: "Member",
        category: "miscellaneous",
        aliases: ["viewfavquote", "viewfav", "viewfavq", "vfq"]
    },
    run: async (bot, message, args) => {
        let arText;
        let enText;
        let surah;
        let ayahNumber;
        let englishName;
        let englishNameTranslation;
        let ayah;
        let number;
        let foundFile;

        const quotes = `././favoritequotes/${message.author.id}/`;
        fs.readdir(quotes, async function (err, files) {
            if (err) {
                console.log("Unable to scan directory: " + err);
            }
            files.forEach(async function (file) {
                file = file.substring(0, file.indexOf('_'));
                const url = "https://api.alquran.cloud/ayah/" + file + "/en.asad";
                const urlArabic = "https://api.alquran.cloud/ayah/" + file;
                await fetch(url).then(res => res.json()).then(data => {
                    enText = data.data.text;
                    await fetch(urlArabic).then(res => res.json()).then(data => {
                        arText = data.data.text;
                        ayahNumber = data.data.numberInSurah;
                        surah = data.data.surah.number;
                        englishName = data.data.surah.englishName;
                        englishNameTranslation = data.data.surah.englishNameTranslation;
                        number = data.data.number;

                        let embed = new RichEmbed()
                            .addField("Arabic", arText)
                            .addField("English", enText)
                            .setColor(cyan)
                            .setDescription(englishName + " (" + englishNameTranslation + ") " + surah + ":" + ayahNumber + " | Number: " + number)
                            .setAuthor(`Random quran quote!`, message.guild.iconURL)
                        await message.channel.send(embed);
                    })
                });
                setTimeout(function(){console.log("1 second timeout");}, 1500);
            })
        });

    }
}

最佳答案

array.prototype.forEach 它是一个回调函数,最好使用 for (cosnt file of files)

这个soltuin必须正常工作,并且在使用use .then(data=>)时不需要使用await

const fetch = require("node-fetch");
const path = require("path");
const {
    RichEmbed
} = require("discord.js");
const {
    stripIndents
} = require("common-tags");
const {
    cyan
} = require("../../colours.json");
const fs = require("fs");

module.exports = {
    config: {
        name: "viewfavoritequotes",
        description: "Shows all your favorite quotes as individual messages.",
        accessableby: "Member",
        category: "miscellaneous",
        aliases: ["viewfavquote", "viewfav", "viewfavq", "vfq"]
    },
    run: async (bot, message, args) => {
        const quotes = `././favoritequotes/${message.author.id}/`;
        fs.readdir(quotes, async function (err, files) {
            if (err) console.log("Unable to scan directory: " + err);
            for ( let file of files) {
                file = file.substring(0, file.indexOf('_'));
                let url = "https://api.alquran.cloud/ayah/" + file + "/en.asad";
                let urlArabic = "https://api.alquran.cloud/ayah/" + file;
                await fetch(url).then(res => res.json()).then(data => {
                     let enText = data.data.text;
                     fetch(urlArabic).then(res => res.json()).then(data => {
                        let arText = data.data.text;
                        let ayahNumber = data.data.numberInSurah;
                        let surah = data.data.surah.number;
                        let englishName = data.data.surah.englishName;
                        let englishNameTranslation = data.data.surah.englishNameTranslation;
                        number = data.data.number;

                        let embed = new RichEmbed()
                            .addField("Arabic", arText)
                            .addField("English", enText)
                            .setColor(cyan)
                            .setDescription(englishName + " (" + englishNameTranslation + ") " + surah + ":" + ayahNumber + " | Number: " + number)
                            .setAuthor(`Random quran quote!`, message.guild.iconURL)
                        await message.channel.send(embed);
                    })
                });
            }
        });
    }
}

关于javascript - 消息在需要所有数据之前发送,这意味着它发送了几条消息,所有消息中的数据都相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60812440/

相关文章:

javascript - 获取具有不同Where条件的报告

javascript - 使用 John Resig 的 javascript 继承时缓存它

node.js - Firebase 中嵌套事务的含义?

javascript - 仅具有特定角色的命令

Discord:如何在消息回复中启用斜线命令?

javascript - 在点击再次起作用之前需要点击才能走完全程

javascript - 如何从 firebase 存储中更快地加载图像?

javascript - NodeJs : TypeError: require(. ..) 不是函数

angularjs - 将 Markdown 集成到 AngularJS 中?

javascript - 跨多个 channel 获取消息