假设我有一个功能

function* request(url) {
   return global.fetch(url).then(response =>
     _.result(response, 'json'))
}


这两个代码示例对我来说都很好

const {data} = yield call(request, 'http://example.com/api');
yield put(actionSuccess(data));




const {data} = yield request('http://example.com/api');
yield put(actionSuccess(data));


因此是问题。对返回promise的函数使用call效果有什么好处?

最佳答案

使用call()的一些好处:


Testability,文档似乎提到的唯一好处(页面下半部分)。我建议使用redux-saga-test-plan,它可以通过直接提供返回值来模拟call()和其他效果。
更细的task cancellation。 Sagas是ES6生成器,仅在使用yield语句时才产生控制权(回到redux-saga中间件)。这些是可能发生取消的唯一点。 yield call()使redux-saga有机会在即将不再需要的呼叫之前取消任务。使用gen.return()生成器方法执行任务取消。 [1] [2]
一般而言,更细粒度的任务调度。 Redux-saga的并发模型基本上是协作式多任务处理。 JavaScript是单线程的。因此,当您yield时,这是redux-saga中间件执行任何类型的调度其他任务的唯一机会。 (不过,我不确定redux-saga的表现如何。)


有关更多信息,我认为最好在redux-saga的Github上打开一个问题,直接询问维护者。

10-08 11:53