docs指出,为了运行并行任务,我们会做这样的事情
const [ a, b, c, ] = yield [ forkA, forkB, forkC ]
您建议哪些策略处理这些任务的状态?
例如:
a / c成功,做X动作 b不成功,做你的行动
我想过按照
的方式使用actionChannels
const tasksStarted = yield actionChannel(start_task);
const tasksCompleted = yield actionChannel(end_task);
然后可以将每个完成的任务放入相应的桶(X / Y)
但是,我不确定这是否过度设计,如果有其他人解决了类似问题,我们需要进行健全性检查。
为了给出比例感,这个任务数组的上限可以达到20个。
我也在Redux-Saga问题上发布了这个问题,但由于这里的社区很棒,我认为尝试两种 ahem 频道都值得。
答案 0 :(得分:0)
好吧,你使用sagas来执行一些异步操作,这些操作应该在状态上交换数据。当前情况中最简单的选项是使用fork function()而不是自动构造来捕获所有redux动作。有关分叉模型的一般信息,请参阅https://redux-saga.js.org/docs/advanced/ForkModel.html。
如果不仅需要组织一组期望流程,而且还需要根据共同状态使其分支,则可以使用关闭技巧和“冻结”承诺。
function generateTrigger() {
let raiseSuccess = null, raiseFail = null;
let promise = new Promise((resolve, reject) => {
raiseSuccess = resolve;
raiseFail = reject;
})
return {
raiseSuccess,
raiseFail,
promise
}
}
let trigger = generateTrigger();
function* task1() {
while(true) {
// Some code
if (isSuccess) {
trigger.raiseSuccess();
trigger = generateTrigger();
} else {
trigger.raiseFail();
trigger = generateTrigger();
}
// Some code
}
}
function* task2() {
while(true) {
// Some code
try {
yield call(() => trigger.promise);
// If task1 done with success
} catch (e) {
// If task1 done with fail
}
// Some code
}
}
function* main() {
try {
yield fork(task1)
yield fork(task2)
} catch (e) {
}
}