在redux-saga中,您可能因为什么原因而赞成使用call
与fork
和join
?
例如,在调用HTTP API时,执行此操作的优缺点是什么:
const result = yield call(apiWrapperFunction, arg1, arg2)
与此相对:
const task = yield fork(apiWrapperFunction, arg1, arg2)
const result = yield join(task)
答案 0 :(得分:7)
据我所知,没有那么多,但您可以取消fork
和join
之间的任务。
const task = yield fork(api, arg);
if (someCondition) {
yield cancel(task);
}
const result = yield join(task);
// Now a no-op since `join` blocked for the task to finish
cancel(task);
当您使用spawn
时,差异会更大。它将创建一个分离的分支,当父任务是(例如)时,它不会自动取消。
答案 1 :(得分:0)
除了@Pier的answer,
两者都可以用来调用普通函数和生成器函数。
此外,fork(fn, ...args)
在 fn 上执行 non-blocking 呼叫-call(fn, ...args)
处于阻塞状态。
示例:
function* main() {
yield fork(someSaga);
console.log('this won't wait for the completion of someSaga');
}
function* main() {
yield call(someSaga);
console.log('this will wait for the completion of someSaga');
}
这是一个有用的example的fork。