Доброго времени суток! Столкнулся со следующей проблемой: После возврата массива со всеми песнями(метод 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)); } }) } 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)); } }) } 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); } }) } 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); } }) }
Еще актуально? Не знаю зайду ли сюда еще, но если это поможет, то внутри промиса не пиши try catch так как ты создаешь новую область видимости. Обработку ошибок catch пиши у функции searchVideo().catch((error) => {})