Node.js как передать индекс массива в асинхронную функцию - PullRequest
0 голосов
/ 06 февраля 2020

У меня проблемы с пониманием того, как правильно настроить функцию обещания / асинхронную работу так, как я хочу. Я знаю, что HTTP-запросы асинхронны, поэтому for l oop продолжит работать, пока выполняются HTTP-запросы. Из-за этого я не могу получить доступ к информации о событии (eventName, eventDate) при выполнении действий в запросе http. Я могу получить доступ к своему массиву из запроса, но мой индекс равен 2 (0 и 1 - только допустимые записи), потому что l oop завершено. Как я могу передать свой индекс для использования в запросе http? Если это невозможно, как я могу получить свой ответ API перед завершением для l oop? Я попытался сделать HTTP-запрос в ожидании ответа, но вложение функций сделало это трудным для меня. Любая помощь будет принята с благодарностью.

var CronJob = require('cron').CronJob;
const { Client, RichEmbed, Discord } = require('discord.js');
const { config } = require('dotenv');
const fetch = require('node-fetch');
var discord = require('discord.js');

const client2 = new discord.Client();

var rp = require('request-promise');

const MongoClient = require('mongodb').MongoClient;
const uri = "{URI}";
const dbClient = new MongoClient(uri, { useNewUrlParser: true });

const https = require("https");

const client = new Client({
    disableEveryone: true
});


config({
    path: __dirname + "/.env"
});

//prefix

const settings = {
    prefix: '!'
};


client2.on('ready', () => {
    console.log('I am ready!');

    new CronJob('0,30 * * * * *', function(){

        dbClient.connect(err => {
            var monitoredEvents = dbClient.db("{dbName}").collection("{collectionName}");

            monitoredEvents.find({}).toArray(function(err, result) {
                if (err)
                {
                    console.log("ERROR!!");
                }
                else
                {
                    var shows = result;

                    var eventName = '';
                    var eventDate = '';

                    var show = '';

                    for(var index = 0; index < shows.length; index++)
                    {
                        eventName = shows[index].eventName;
                        eventDate = shows[index].eventDate;

                        show = shows[index];



                        const url = `{URL}`;

                        https.get(url, res => {
                            res.setEncoding("utf8");
                            let body = "";
                            res.on("data", data => {
                                body += data;
                            });
                            res.on("end", () => {
                                body = JSON.parse(body);

                                facets = body.facets;

                                function myfunction(arr) {
                                    return arr.map(function(e) {

                                        return {
                                            section: e.section,
                                            count: e.count
                                        };
                                    });
                                }

                                let myMap = new Map();


                                //get newArray which contains sections and count.
                                let newArray = myfunction(facets);

                                //take newArray and combine same sections
                                const out = newArray.reduce((a, o) => {
                                    if (a[o.section]) {
                                        a[o.section].count += o.count
                                    } else {
                                        a[o.section] = o
                                    }
                                    return a
                                }, {})


                                let num = Object.values(out);


                                var output = [];
                                var totalCount = 0;

                                for(var j = 0; j < num.length; j++)
                                {
                                    output[j] = num[j].section + ' (' + num[j].count + ')';
                                    totalCount += parseInt(num[j].count);
                                }

                                var outputString = output.join("\n");

                                if(alertValue >= totalCount)
                                {

                                    var guild = client2.guilds.get('{guildID}');
                                    if(guild && guild.channels.get('{channelID}')){

                                        guild.channels.get('{channelID}').send(eventName + " on " + eventDate + " has only " + totalCount + " tickets remaining").then();







                                    } else {
                                        console.log("nope");
                                    }
                                }
                                else
                                    console.log("alert threshhold not met for "+ eventName);
                            });
                        });
                    }
                }
            });

        });
    }, null, true, "America/Los_Angeles");
});


client2.login("{discordToken}")

1 Ответ

2 голосов
/ 06 февраля 2020

Вы можете создать отдельную функцию для обработки запроса get. Вот пример



const createGetAPI = (showObject, URL) => {
    if (showObject && showObject.eventName && showObject.eventDate) {
        https.get(URL, (req, res) => {
            console.log('Do your all operations here');
        });
    }
};

dbClient.connect(err => {
    var monitoredEvents = dbClient.db("{dbName}").collection("{collectionName}");

    monitoredEvents.find({}).toArray(function (err, result) {
        if (err) {
            console.log("ERROR!!");
        }
        else {
            let shows = result;
            let show = '';

            for (let index = 0; index < shows.length; index++) {
                eventName = shows[index].eventName;
                eventDate = shows[index].eventDate;
                const url = `someurl/somepath/${index}`;

                createGetAPI(shows[index], url);
            }
        }
    }
}

...