https://redux-saga.js.org/docs/advanced/Channels.htmlUsing channels to communicate between Sagas
这里的实现和你这个基本等价, 而且注意这里handler和触发请求的逻辑是完全解耦的.
而且实现上来讲我觉得saga的更加清晰啊
function* watchRequests() {
// create a channel to queue incoming requests
const chan = yield call(channel)
// create 3 worker 'threads'
for (var i = 0; i < 3; i++) {
yield fork(handleRequest, chan)
}
while (true) {
const {payload} = yield take('REQUEST')
yield put(chan, payload)
}
}
function* handleRequest(chan) {
while (true) {
const payload = yield take(chan)
// process the request
}
}
而且如果使用async/await来模拟解耦副作用和执行, 基本上就很困难了啊.
【 在 hgoldfish (老鱼) 的大作中提到: 】
没错啊。take 和 put 就是 event.wait 和 event.set. 换个名字而已。。其实他们都是 promise 的另外一个写法。publish/subscribe 什么的,换汤不换药。我上面说了,Event 就是协程使用的 promise,只是协程环境下不建议直接使用 promise.
你看看用 saga 要怎么实现这个功能,刚好演示一下 Semaphore:
let smp = Semaphore(5);
let operations = CoroutineGroup();
let urls = [...]; // 一共十条链接
let responses = Coroutine.map(async (url) => {
await smp.acquire();
try {
let r = http.get(url);
return r.json();
} finally {
smp.release();
}
}, urls);
以上代码向后台请求十条 URL,但每次只发出五条请求,一条请求结束后才发出另外一条。
它的特化形式就是 Lock. 应用场景是,比如登录模块是受框架调用的,可能一次发出三条登录请求,显然这是不合理的,这时候就可以用 Lock. 用 Promise 实现也简单,设置一个变量一开始设为 null,第一个请求将它设置为 new Promise(),其它请求等待它的 resolved 就行了。都是相通的。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 下午手机码字很费劲, 这个loginEvent 的模拟, 用saga写应该大致类似这样:
: function* app() {
: yield fork(loginFlow)
: ...................
--
FROM 101.85.232.*