我正在尝试使用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
。有没有一种方法可以更改传奇以达到预期效果?
您不是返回呼叫,因此无法屈服。更重要的是-yield all
需要一个返回Promises的函数数组。调度动作不会返回Promise,这就是您在这里所做的。 put
是non-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));
)
)
);