消息在需要所有数据之前就已发送,这意味着它发送了所有消息中具有相同数据的几个消息

时间:2020-03-23 11:12:10

标签: javascript node.js discord.js

我正在学习节点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);
            })
        });

    }
}

1 个答案:

答案 0 :(得分:0)

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

此Soltuin必须正确运行,并且在使用use .then(data=>)时不需要使用wait。

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);
                    })
                });
            }
        });
    }
}