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);
}
}
这样你就不会错过任何一个动作。
这是否被认为是非阻塞的,或者如果 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);
}
}
这样你就不会错过任何一个动作。