没错啊。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 112.47.122.*