在saga中,我创建了一个连续调用的生成器,当第二次调用时,第一次调用在飞行中,那么第一个动作就会被取消,我只从第二个请求中获取数据,以下是我的代码在减速器中的初始状态
export const initialState = {
sectionData:
{
featuredData: false,
popularData: false,
}}
featuredData和popularData会根据saga中api调用的结果进行更新。
这是我的传奇代码
function* getSectionData(){ yield takeLatest(LOAD_SECTION_DATA, fetchSectionData) }
function* fetchSectionData(action){
try
{
var requestURL = `http://localhost:3001/v1/fetchData?page=` + action.section_name;
console.log('Request Url', requestURL)
const response = yield call(getRequest, requestURL);
var result = {}
if (action.section_name)
{
let sectionName = [action.section_name] + 'Data'
result[sectionName] = response.data
}
console.log('Request result', result)
yield put(sectionDataLoaded(result));
}
catch (err)
{
yield put(sectionDataLoadingError(err));
}}
export default function* HomePageSaga(){ yield all([getSectionData()]); }
我连续调用fetchSectionData('feature')fetchSectionData('popular'),得到的结果是
sectionData{
featuredData: false,
popularData: [{
name: 'popular'
}]}
而不是
sectionData{
featuredData: [
{
name: 'featured'
}],
popularData: [
{
name: 'popular'
}]}
这正是takeLatest的工作方式。如果一个请求已经开始,然后另一个请求被发出,第一个请求被取消。我想你应该用takeEvery代替。请看 https:/redux-saga.js.orgdocsapi。 来实现takeEvery的功能。