Redux 传奇在获得连续请求时取消了先前的
Redux saga cancels previous while getting consecutive request
在 saga 中,我创建了一个连续调用的生成器。当进行第二个呼叫并且第一个呼叫正在进行时,第一个操作被取消,我只从第二个请求中获取数据
这是我的代码
reducer 中的初始状态
export const initialState = {
sectionData:
{
featuredData: false,
popularData: false,
}}
featuredData 和 popularData 根据 api 调用 saga
的结果进行更新
这是我的 saga 代码
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('featured')
fetchSectionData('popular') 连续
我得到的结果是
sectionData{
featuredData: false,
popularData: [{
name: 'popular'
}]}
而不是
sectionData{
featuredData: [
{
name: 'featured'
}],
popularData: [
{
name: 'popular'
}]}
这正是 takeLatest 的工作方式。如果一个请求已启动,然后又发出另一个请求,则第一个请求将被取消。我想你想改用 takeEvery 。有关 takeEvery 的功能,请参阅 https://redux-saga.js.org/docs/api/。
您正在使用 takeLatest
对于您的情况,确保使用 takeEvery
还有read
在 saga 中,我创建了一个连续调用的生成器。当进行第二个呼叫并且第一个呼叫正在进行时,第一个操作被取消,我只从第二个请求中获取数据 这是我的代码 reducer 中的初始状态
export const initialState = {
sectionData:
{
featuredData: false,
popularData: false,
}}
featuredData 和 popularData 根据 api 调用 saga
的结果进行更新这是我的 saga 代码
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('featured') fetchSectionData('popular') 连续 我得到的结果是
sectionData{
featuredData: false,
popularData: [{
name: 'popular'
}]}
而不是
sectionData{
featuredData: [
{
name: 'featured'
}],
popularData: [
{
name: 'popular'
}]}
这正是 takeLatest 的工作方式。如果一个请求已启动,然后又发出另一个请求,则第一个请求将被取消。我想你想改用 takeEvery 。有关 takeEvery 的功能,请参阅 https://redux-saga.js.org/docs/api/。
您正在使用 takeLatest
对于您的情况,确保使用 takeEvery
还有read