Работа с Promise node.js
Не могу разобраться толком с этими промисами... структура кода без промисов такая:
Вызываю асинхронную функцию внутри map()
res.item.map((i) => {
play(DISCORDMessage, DISCORDClient, i.link, i.name, i.image, i.artist, i.duration);
})
асинхронная она только потому что внутри функции есть тоже асинхронная функция из сторонней библиотеки.
по факту мне надо выполнить всю эту функцию синхронно ( по порядку строка за строкой чтоб они не перегоняли друг друга и новая функция play не запустится до того момента пока не выполнится предыдущая ).
function play
module.exports = (async (DISCORDMessage, DISCORDClient, url, title, img_url, artist, duration) => {
if (!DISCORDMessage.member.voice.channel)
return DISCORDMessage.channel.send("You need to be in a voice channel to play music!");
if (!DISCORDMessage.member.voice.channel.permissionsFor(DISCORDMessage.client.user).has("CONNECT") ||
!DISCORDMessage.member.voice.channel.permissionsFor(DISCORDMessage.client.user).has("SPEAK")) {
return DISCORDMessage.channel.send("I need the permissions to join and speak in your voice channel!");
}
if (!DISCORDMessage.client.queue.get(DISCORDMessage.guild.id)) {
DISCORDMessage.client.queue.set(DISCORDMessage.guild.id, {
textChannel: DISCORDMessage.channel,
voiceChannel: DISCORDMessage.member.voice.channel,
connection: null,
songs: [],
volume: 5,
playing: true,
player: '' // тут должна быть функция отправки данных на сервер и получения ответа
// но если я ее сюда ставлю то пока я получаю ответ запускается новая функция play
// и все идет к чертям.
});
DISCORDMessage.client.queue.get(DISCORDMessage.guild.id).songs.push({ Title: unescape(title), URL: url, Img_url: img_url, Artist: artist, Duration: duration });
try {
DISCORDMessage.client.queue.get(DISCORDMessage.guild.id).connection = await DISCORDMessage.member.voice.channel.join();
DISCORDMessage.client.queue.get(DISCORDMessage.guild.id).player = await DISCORDMessage.channel.send(DISCORDClient.embed);
// код работает только если я ставлю ожидание от сервера тут. но в этом случае я просто попадаю в тайминги... а мне надо удостовериться что весь предыдущий код выполнен прежде чем продолжать перебор и вызов функции Play
await Play(DISCORDMessage, DISCORDClient, DISCORDMessage.client.queue.get(DISCORDMessage.guild.id).songs[0]);
} catch (err) {
console.log(err);
DISCORDMessage.client.queue.delete(DISCORDMessage.guild.id);
return DISCORDMessage.channel.send(err);
}
} else {
DISCORDMessage.client.queue.get(DISCORDMessage.guild.id).songs.push({ Title: unescape(title), URL: url, Img_url: img_url, Artist: artist, Duration: duration });
if (url.indexOf('.mp3') === -1) { return DISCORDMessage.channel.send(`**${title}** была добавлена в очередь!`); }
}
})
Я буду очень благодарен за разъяснения с этим неладным Promis'oм. После c# эта система ооочень не удобна по сравнению с Task.
И я понемногу задумываюсь перебраться на dotnet core по причине меньшего потребления ОЗУ так как нагрузки на бота которого я пишу будут большие. Стоит ли? За ранее большое спасибо!