Вызов Redux-Saga () и put () в карте - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь сделать несколько запросов, используя функции all() и map(), и если результат приходит и имеет ожидаемую форму, я хочу вызвать другое действие, чтобы сохранить результат в моем магазине.

Вот часть моей саги, но она не работает должным образом - getAvailabilityRequest не выполняется.

   yield all(
    part1.map((p1) => {
      return part2.map((p2) => {
        return tld.map((t) => {
          const response =  call(getAvailabilityRequest, `${p1}${p2}.${t}`);
          if (response && isAvailabilityResult(response)) {
              const index: AvailabilityIndex = { part1: p1, part2: p2, tld: t };
              return put(setAvailabilityActionCreator({ index, item: response }));
            }
        });
      });
    })
  );

Также я попытался это

  const response = yield all(
    part1.map((p1) => {
      return part2.map((p2) => {
        return tld.map((t) => {
          return {index: { part1: p1, part2: p2, tld: t }, result: call(getAvailabilityRequest, `${p1}${p2}.${t}`)};
        });
      });
    })
  );

, чтобы сохранить данные о index, но все же getAvailabilityRequest не вызывается. Есть ли способ изменить сагу, чтобы получить ожидаемые результаты?

1 Ответ

1 голос
/ 02 мая 2020

Вы не возвращаете вызов, поэтому он не может быть получен . Что важнее - yield all ожидает массив функций, которые возвращают Promises . Отправка действия не возвращает Обещание , и это то, что вы делаете здесь. put - это неблокирующие вызовы.

Я бы предложил делегировать лог c отдельной функции генератора.

function* getAvailability(p1, p2, t) {
   try {
      const response = call(getAvailabilityRequest, `${p1}${p2}.${t}`);
      if (response && isAvailabilityResult(response)) {
          const index: AvailabilityIndex = { part1: p1, part2: p2, tld: t };
          yield put(setAvailabilityActionCreator({ index, item: response }));
      }
   } catch (error) {
     // error logic
   }
}

Редактировать : похоже, что вложенная map является проблемой. yield all ожидает плоский массив.

const calls = yield [];

yield part1.forEach((p1) => {
   part2.forEach((p2) => {
      tld.forEach((t) => {
         calls.push(call(getAvailabilityRequest, `${p1}${p2}.${t}`));
      });
   });
});


const response = yield all(calls);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...