我见过传奇以三种方式听取行动:
1. while(true)take()
function* onUserDetailsRequest() {
while(true) {
const { userId } = yield take(USER_DETAILS_REQUESTED);
const response = yield call(fetchUserDetails, userId);
put(USER_DETAILS_RECEIVED, response);
}
}
Run Code Online (Sandbox Code Playgroud)
2. while(take())
function* onUserDetailsRequest() {
while(yield take(USER_DETAILS_REQUESTED)) {
const userId = yield select(userSelectorFn);
const response = yield call(fetchUserDetails, userId);
put(USER_DETAILS_RECEIVED, response);
}
}
Run Code Online (Sandbox Code Playgroud)
3. takeEvery()
function* onUserDetailsRequest() {
yield takeEvery(USER_DETAILS_REQUESTED, function* (action) {
const { userId } = action;
const response = yield call(fetchUserDetails, userId);
put(USER_DETAILS_RECEIVED, response);
}
}
Run Code Online (Sandbox Code Playgroud)
各自的优点和缺点是什么?在哪种情况下我们应该使用另一种情况?
是否有使用终极版,传奇的任何优势yield all([])了ES6的内置yield []?
为了并行运行多个操作,redux-saga建议:
const result = yield all([
call(fetchData),
put(FETCH_DATA_STARTED),
]);
Run Code Online (Sandbox Code Playgroud)
但是没有all()方法可以实现同样的目的:
const result = yield [
call(fetchData),
put(FETCH_DATA_STARTED),
];
Run Code Online (Sandbox Code Playgroud)
哪一个更好?为什么?