下午手机码字很费劲, 这个loginEvent 的模拟, 用saga写应该大致类似这样:
function* app() {
yield fork(loginFlow)
yield fork(loadDataFlow)
}
function* loginFlow() {
const loginData = yield take('login-form-submitted')
const result = yield loginUsingData(loginData)
if (result.success) {
yield put('login-success', result.userInfo)
yield take('request-logout')
yield logout(result.userInfo.uid)
} else {
yield put('login-failed', result.reason)
}
}
function* loadDataFlow() {
while(true) {
const info = yield take('login-success')
yield loadUserInfo(info.uid)
yield take('logout')
}
}
【 在 hgoldfish (老鱼) 的大作中提到: 】
Event 和 Promise 的使用场景是一样的。我举个例子。
比如你有两个模块,第一个模块负责登录,第二个模块需要登录以后才能用。两个模块都是框架调用的,你自己没法控制它们的顺序。这时候,你一般会设置一个:
let loginEvent = new Promise(...);
第二个模块要加载数据之前先等待登录事件:
loginEvent.then(...);
这时候 Event 跟 Promise 是完全一样的。相互可以代替:
let loginEvent = new Event();
await loginEvent.wait();
Event 和 Promise 使用上唯一不同的地方可能是 Event 可以被 clear(). 我实现 Event 主要是 Promise 不能被直接用于协程。作为对比,协程版本的 Event 的 Promise.all() 和 Promise.any() 这样写:
class Event {
static async all(events) {
for (let event of events)
if (!(await event.wait())) return false;
return true;
}
static async any(events) {
for (let event of events)
if (await event.wait()) return true;
return false;
}
}
总之,用了协程以后,一切回归到传统的 javascript 过程式编程,不再需要回调函数。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 别的先不说, 引入Semaphore, 是为了解决啥问题?
--
FROM 101.85.232.*