Почему сложно использовать генераторы Redux-Saga

Ответ

Генераторы Redux-Saga сложны из-за их асинхронной природы и необходимости понимания концепций генераторов в JS. Они требуют ручного управления потоком выполнения через yield, что усложняет отладку и чтение кода. Также необходимо запоминать эффекты (например, call, put), которые абстрагируют сайд-эффекты, но добавляют уровень абстракции.

Пример:

function* fetchUser(action) {
  try {
    const user = yield call(api.fetchUser, action.payload.userId);
    yield put({ type: 'USER_FETCH_SUCCEEDED', user });
  } catch (e) {
    yield put({ type: 'USER_FETCH_FAILED', message: e.message });
  }
}

Проблемы:

  • Кривая обучения (генераторы + эффекты)
  • Избыточность для простых задач
  • Сложность тестирования (нужно мокать эффекты)

Ответ 18+ 🔞

А, генераторы в Redux-Saga, да? Ну это ж классика, блядь! Ёперный театр, честно говоря.

Смотри, в чём прикол, а прикол в том, что это как будто ты пытаешься объяснить квантовую механику мартышке. С одной стороны, мощно, с другой — нихуя не понятно с первого раза.

Вот смотри на этот код, будто он простой:

function* fetchUser(action) {
  try {
    const user = yield call(api.fetchUser, action.payload.userId);
    yield put({ type: 'USER_FETCH_SUCCEEDED', user });
  } catch (e) {
    yield put({ type: 'USER_FETCH_FAILED', message: e.message });
  }
}

Вроде бы логика на лицо: вызвали, получили, отправили успех, если словили ошибку — отправили провал. Ан нет, сука! Тут подвох.

Проблема номер раз — это сами генераторы. Это не просто функции, это, блядь, такие функции-зомби, которые можно поставить на паузу, а потом разбудить и сказать: «Продолжай, сука, с того же места!». yield — это как крик «СТОП, блядь, я тут подожду, пока этот асинхронный трэш завершится». И мозг сначала скипает, пытаясь понять, кто, когда и зачем эту паузу делает.

Проблема номер два — эти ваши эффекты. call, put. Это ж надо запомнить, что call — это «эй, выполни-ка эту штуку», а put — это «а теперь швырни этот экшен в редюсер, как гранату». А ещё там take, fork, select — овердохуища всего! Получается, что ты пишешь не на чистом JS, а на каком-то своём диалекте, который придумали сагисты. Чих-пых тебя в сраку, зачем столько абстракций-то?

И самое весёлое — тестирование. Хочешь протестировать эту простыню? Приготовься, блядь, к цирку с конями! Надо все эти yield замовкивать, чтобы они возвращали тестовые данные, и следить за порядком, а то один yield перепутаешь — и всё, пиздец, тест падает, а ты три часа ищешь, где накосячил. Терпения ноль, ебать!

Короче, инструмент мощный, спору нет. Для сложных сценариев, где сайд-эффекты пляшут гопак, — самое то. Но для того, чтобы просто юзера получить с сервака? Да это как из пушки по воробьям, ей-богу. Слишком много церемоний, слишком много магии, которую сначала полгода изучать надо. Волнение ебать, когда с этим работать начинаешь.