У меня проблемы с пониманием того, как правильно настроить функцию обещания / асинхронную работу так, как я хочу. Я знаю, что 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}")