yield take 是否被视为非阻塞调用?

is yield take considered a non blocking call?

这是否被认为是非阻塞的,或者如果 action1 被多次调度,第一个 take 可以是 dropped/missed 吗?

function* nonBlockingSaga () {
    while (true) {
        yield take('action1');
        yield take('action2');
        yield take('action3');
    }
}

是的,如果你发送 action1,传奇将被 take('action2') 阻止,你将错过任何 action1 动作,直到传奇循环。要实现 around/solve,您可以使用 action channel。操作通道允许您缓冲操作,直到您的 saga 准备好执行它们。

因此在您的示例中,这将导致:

function* nonBlockingSaga () {
  const channel1 = yield actionChannel('action1');
  const channel2 = yield actionChannel('action2');
  const channel3 = yield actionChannel('action3');
  while (true) {
    yield take(channel1);
    yield take(channel2);
    yield take(channel3);
  }
}

这样你就不会错过任何一个动作。