Неправильная последовательность печати заголовков видео YouTube с использованием ytdl-core - PullRequest
1 голос
/ 05 мая 2019

У меня бот-диск с диссонансом. Моя проблема в неправильной последовательности при печати заголовков видео YouTube. Когда я собираюсь отправить результаты в текстовый канал, я вижу случайную отправку заголовков, а не то, что я ожидал.

Я пытался использовать функции async / await, но все равно не работает.

function queueNow(message) {
    let arr = queueArr; //array with urls
    if(arr !== undefined && arr.length !== 0) {
        let mes = "```Elm";
        let counterPlaylist = 0;
        if(arr.length != 0) {
            let flag = true;
            arr.forEach(composition => {
                ytdl.getInfo(composition, function(err, info) {
                    if(err === null) {
                        if(info === undefined) {
                            flag = false;
                        }
                        if(flag) {
                            counterPlaylist++;
                            mes += "\n" + counterPlaylist + ") " + info.title;
                        }
                        if(counterPlaylist === arr.length) {
                            mes += "\n```"
                            message.channel.send(mes);
                        }
                    }
                });
            })
        }
    }
}

1 Ответ

0 голосов
/ 05 мая 2019

Проблема в том, что выполнение асинхронных вызовов внутри forEach не обязательно соответствует порядку, в котором они были сделаны.

Вот возможный обходной путь с некоторым рефакторингом с использованием Promise.all, который сохраняет порядок вызовов:

function queueNow(message, arr) {
  if (!arr || !arr.length) return;
  Promise.all(arr.map(composition => ytdl.getInfo(composition)))
    .then(infos => {
      const mes =
        "```Elm" +
        infos.map((info, index) => `\n${index + 1}) ${info.title}`).join("") +
        "\n```";
      message.channel.send(mes);
    })
    .catch(err => {
      console.log(err);
      // Do something with the error
    });
}
...