摆脱可变的`let`

时间:2019-04-20 08:06:11

标签: javascript functional-programming

例如,我需要在循环之外缓存最后一个任务(redux-saga)。

select substring(a.b, v.number + 1, 1) letter
from (select 'WCRTV' b) a
join master..spt_values v on v.number < len(a.b)
where v.type = 'P'

在没有export default function* () { let lastTask; while (true) { const action = yield take(someActions); // some conditions there if (lastTask) { yield cancel(lastTask); } lastTask = yield fork(send(action)); } } 的情况下,我应该使用哪种模式以功能不变的方式使其变为正常?

1 个答案:

答案 0 :(得分:0)

一种选择是使生成器自己递归yield*

function* gen (lastTask) {
  const action = yield take(someActions);
  // some conditions there
  if (lastTask) {
    yield cancel(lastTask);
  }
  const nextLastTask = yield fork(send(action));
  yield* gen(nextLastTask);
}
export default gen;

但是请注意,您的原始代码(或此代码)中没有任何内容涉及变异-let的问题在于它允许重新分配,这在一定程度上相似,但不一样。 (如果可能的话,最好避免变异重新分配,只要代码易于阅读即可)

当然,请确保使用者调用的gen没有参数。