Работа с 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 по причине меньшего потребления ОЗУ так как нагрузки на бота которого я пишу будут большие. Стоит ли? За ранее большое спасибо!


Ответы (0 шт):