Загрузка...

Promises in JavaScript

Thread in Node.js created by xyligan00 May 15, 2021. 194 views

  1. xyligan00
    xyligan00 Topic starter May 15, 2021 0 Jan 30, 2021
    Доброго времени суток! Столкнулся со следующей проблемой: После возврата массива со всеми песнями(метод resolve()) не работает метод reject(). Как можно данный код переписать под то, чтобы коллектор, который запускается после возврата данных работал корректно, а именно выполнялись действия с reject(). Код приложил ниже.

    Code
    searchVideo(member, searchString, message) {
    return new Promise(async (resolve, reject) => {
    let song = {}

    if (!searchString) return reject(new MusicPlayerError(PlayerErrors.searchVideo.userRequestNotFound));

    const voiceChannel = member.voice.channel;
    if (!voiceChannel) return reject(new MusicPlayerError(PlayerErrors.voiceChannelNotFound));

    const permissions = voiceChannel.permissionsFor(this.client.user);
    if (!permissions.has('CONNECT') || !permissions.has('SPEAK')) return reject(new MusicPlayerError(PlayerErrors.permissionsNotFound));

    try {
    if (searchString.includes('https://')) {
    const songInfo = await ytdl.getInfo(searchString);

    song = ({
    searchType: 'search#url',
    title: songInfo.videoDetails.title,
    url: songInfo.videoDetails.video_url,
    thumbnail: songInfo.videoDetails.thumbnails[0].url,
    author: songInfo.videoDetails.author.name,
    textChannel: message.channel,
    voiceChannel: message.member.voice.channel,
    requestedBy: message.author,

    duration: {
    hours: Math.floor(songInfo.videoDetails.lengthSeconds / 3600),
    minutes: Math.floor(songInfo.videoDetails.lengthSeconds / 60 % 60),
    seconds: Math.floor(songInfo.videoDetails.lengthSeconds % 60)
    }
    })

    resolve([song]);
    return resolve(this.addSong(1, member.guild, [song], message.channel, voiceChannel));
    } else {
    const videoResult = await ytSearch(searchString);

    var tracksArray = [];

    for (let i = 0; i < 10; i++) {
    tracksArray.push({
    index: i + 1,
    searchType: 'search#name',
    title: videoResult.videos[i].title,
    url: videoResult.videos[i].url,
    thumbnail: videoResult.videos[i].thumbnail,
    author: videoResult.videos[i].author.name,
    textChannel: message.channel,
    voiceChannel: message.member.voice.channel,
    requestedBy: message.author,

    duration: {
    hours: Math.floor(videoResult.videos[i].seconds / 3600),
    minutes: Math.floor(videoResult.videos[i].seconds / 60 % 60),
    seconds: Math.floor(videoResult.videos[i].seconds % 60)
    }
    })
    }

    resolve(tracksArray)

    this.getSongIndex(tracksArray, message);
    }
    } catch (error) {
    resolve(this.emit('playerError', error));
    }
    })
    }
    Code
    getSongIndex(tracksArray, message) {
    return new Promise(async (resolve, reject) => {
    try {
    const filter = msg => msg.author.id === message.author.id;
    let collector = message.channel.createMessageCollector(filter, { time: 30000 });

    collector.on('collect', msg => {
    if (!isNaN(msg.content)) {
    let number = Math.floor(msg.content);
    if (number < 1 || number > 10) return reject(new MusicPlayerError(PlayerErrors.getSongIndex.mixMaxValue));

    collector.stop();
    return resolve(this.addSong(number, message.guild, tracksArray, message.channel, message.member.voice.channel));
    } else {
    collector.stop();
    return reject(new MusicPlayerError(PlayerErrors.getSongIndex.invalidTypeValue));
    }
    })
    } catch (error) {
    reject(error);
    }
    })
    }
     
  2. asdfowner
    asdfowner May 15, 2021 8 May 10, 2021
    Колбек переданый в Promise ничего не возвращает и уничтожается при вызове resolve.
    Источник: mdn
     
  3. Филипп_inactive56411
    Юзай асинхронные функции, не мучайся с промисами
     
  4. javeoff
    javeoff May 27, 2021 1 Apr 29, 2020
    Еще актуально? Не знаю зайду ли сюда еще, но если это поможет, то внутри промиса не пиши try catch так как ты создаешь новую область видимости. Обработку ошибок catch пиши у функции searchVideo().catch((error) => {})
     
Loading...
Top