Задать вопрос
@Speakermen

Почему ended отрабатывает несколько раз?

Доброго времени суток уважаемые разработчики в компоненте Control.js addEventListener отрабатывает с событием ended несколько раз и перескакивает через несколько треков( Только почему по клику всё нормально отрабатывает

player.addEventListener('ended', () => dispatch(nextAudio()));


Использовал redux toolkit
redux-1024x608-1.jpg

Компоненты не зависимы друг от друга берут из stora, а не из параметров функции

stackblitz react player

Ну и в Reducerе баг из того что логика в playAudio зашла в тупик initialState id = 1 и срабатывает Reducer pauseAudio state.track.id == action.payload при первом запуске если не нажат не один элемент
//slices/playlistSlice.js

import { createSlice } from '@reduxjs/toolkit';
import TrackService from './../services/TrackService.js';

const initialState = {
  id: 1,
  trackService: new TrackService(),
  tracks: new TrackService().findAll(),
  track: new TrackService().findOne(0),
  flag: false,
  audio: new Audio(),
};

const playlistSlice = createSlice({
  name: 'playlist',
  initialState,
  reducers: {
    playAudio: (state, action) => {
      console.log(state.id, state.track.id, action.payload);
      if (state.track.id !== action.payload) {
        state.flag = true;
        state.id = action.payload;
        state.track = state.trackService.findOne(state.id - 1);
        state.audio.src = state.track.audioPath;
        state.audio.play();
        console.log('playAudio');
      } else {
        playlistSlice.caseReducers.pauseAudio(state);
      }
    },
    pauseAudio: (state) => {
      if (state.flag) {
        state.flag = false;
        state.audio.pause();
        console.log('pauseAudio');
      } else {
        state.flag = true;
        state.audio.play();
        console.log('playAudio pause');
      }
    },
    nextAudio: (state) => {
      state.id++;

      if (state.id > state.tracks.length) {
        state.id = 1;
      }

      playlistSlice.caseReducers.playAudio(state, { payload: state.id });
      console.log('nextAudio');
    },
    prevAudio: (state) => {
      state.id--;

      if (state.id < 1) {
        state.id = state.tracks.length;
      }

      playlistSlice.caseReducers.playAudio(state, { payload: state.id });
      console.log('prevAudio');
    },
  },
});

export const { playAudio, pauseAudio, nextAudio, prevAudio } =
  playlistSlice.actions;
export default playlistSlice.reducer;
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 7 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
Проблема в том что ты добавляешь прослушиватель просто в коде и нигде его не очищаешь. Если учесть что компонент может рендериться несколько раз, особенно в режиме разработки, то и прослушивателей может навеситься несколько. Используй для этого хук эффекта , в котором укажи что при размонтировании компонента нужно удалить слушатель события.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽