api / index.js
const URL = 'http://10.0.2.2:5000';
const fetching = false;
export default (type, filter, dateFilter, position) => {
if(fetching) return Promise.reject(new Error('Request in progress'));
fetching = true;
return fetch(URL + `/search/${type}/${filter}/${dateFilter}/${position}/0/0`)
.then(response => Promise.all([response, response.json()]))
.catch(err => console.log("error catch search:", err.message))
}
我需要将fetching设置为false,这样就可以再次调用此函数,但是我不知道在哪里放置它才能使它起作用。
如果我创建另一个,则在写之后,在捕获之前像这样:
.then(() => fetching = false)
问题在于,它会将false返回到调用函数的位置,而不是返回该位置的数据:
Action / index.js
getDataApi(type, filter, dateFilter, position)
.then(res => {
if (res !== false) {
if (state.dataReducer.data.length === 0) {
dispatch(getDataSuccess(res[1]))
} else {
dispatch(getDataSuccess(res[1], state.dataReducer.data))
}
}
})
.catch((err) => console.log(9999, err))
所以我的问题是它没有输入getDataSuccess,因为它是false。我不知道为什么它不能将数据发送到此函数,并且最终发送fetching = false的结果。
最佳答案
您需要另一个.then
,以便在fetching
解析后可以重新分配response.json()
。您可能还应该在fetching
中重新分配catch
,以便即使出现一次错误也可以进行将来的请求,而在return false
中重新分配catch
,以便.then
之后的getDataAPI
将正确地忽略失败的请求。另外,对于let
,请使用const
而不是fetching
:
const URL = 'http://10.0.2.2:5000';
let fetching = false;
export default (type, filter, dateFilter, position) => {
if (fetching) return Promise.reject('Request in progress');
fetching = true;
return fetch(URL + `/search/${type}/${filter}/${dateFilter}/${position}/0/0`)
.then(response => Promise.all([response, response.json()]))
.then(([response, responseObj]) => {
fetching = false;
return [response, responseObj];
})
.catch(err => {
console.log("error catch search:", err.message);
fetching = false;
// Choose one, depends what you need.
return false; // If you want to ignore the error and do something in a chained .then()
return Promise.reject(err); // If you want to handle the error in a chained .catch()
})
}