Redux-Saga call()和put()在地图中

问题描述 投票:0回答:1

我正在尝试使用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。有没有一种方法可以更改传奇以达到预期效果?

redux-saga
1个回答
0
投票

您不是返回呼叫,因此无法屈服。更重要的是-yield all需要一个返回Promises的函数数组。调度动作不会返回Promise,这就是您在这里所做的。 putnon-blocking调用。

我建议您将逻辑委托到单独的生成器函数。

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
   }
}

然后在您当前的传奇中:

yield all(
   part1.map((p1) =>
      return part2.map((p2) =>
         return tld.map((t) =>
            return call(getAvailability, p1, p2, t));

      )
   )
);
© www.soinside.com 2019 - 2024. All rights reserved.