Загрузка...

Промисы в JavaScript

Тема в разделе Node.js создана пользователем xyligan00 15 май 2021. 196 просмотров

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

    Код
    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));
    }
    })
    }
    Код
    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 15 май 2021 8 10 май 2021
    Колбек переданый в Promise ничего не возвращает и уничтожается при вызове resolve.
    Источник: mdn
     
  3. Филипп_inactive56411
    Филипп_inactive56411 22 май 2021 Заблокирован(а) 137 30 окт 2016
    Юзай асинхронные функции, не мучайся с промисами
     
  4. javeoff
    javeoff 27 май 2021 1 29 апр 2020
    Еще актуально? Не знаю зайду ли сюда еще, но если это поможет, то внутри промиса не пиши try catch так как ты создаешь новую область видимости. Обработку ошибок catch пиши у функции searchVideo().catch((error) => {})
     
Загрузка...
Top