sagas - 跟踪和处理并行任务

时间:2017-04-20 17:27:12

标签: javascript asynchronous redux react-redux redux-saga

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 频道都值得。

1 个答案:

答案 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) {
  }
}