Bri*_*ean 4 fetch promise reactjs react-native redux
如果取消提交尚未解决一段时间后,我想向用户显示超时错误.
我已经看到了一些在这里添加setTimeout来获取的好例子:https: //github.com/github/fetch/issues/175
但是,如何处理同时使用redux的获取承诺?例如
export function getData() {
return (dispatch, getState) => {
fetch('blah.com/data')
.then(response => response.json())
.then(json => dispatch(getDataSuccess(json)))
.catch(
error => {
console.log(error)
}
)
dispatch({
type: DATA_FETCH_REQUEST
})
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢阅读!
小智 23
我一直渴望有一个使用Promise.race的理由,它适用于这个用例.Promise.race等待第一次解决或第一次拒绝.因此,如果拒绝先发射,那么它永远不会then在Promise.race上发射.更多信息请访问https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race.对不起,我没有机会测试代码.
export function getData() {
return (dispatch, getState) => {
let timeout = new Promise((resolve, reject) => {
setTimeout(reject, 300, 'request timed out');
})
let fetch = new Promise((resolve, reject) => {
fetch('blah.com/data')
.then(response => response.json())
.then(json => resolve(json))
.catch(reject)
})
return Promise
.race([timeout, fetch])
.then(json => dispatch(getDataSuccess(json)))
.catch(err => dispatch(getDataTimeoutOrError(err)))
}
}
Run Code Online (Sandbox Code Playgroud)
基于你提到的github的片段,你可以做这样的事情:
function timeoutPromise(ms, promise) {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error('Timeout'));
}, ms);
promise.then(
(res) => {
clearTimeout(timeoutId);
resolve(res);
},
(err) => {
clearTimeout(timeoutId);
reject(err);
}
);
})
}
export function getData() {
return (dispatch, getState) => {
dispatch({type: DATA_FETCH_REQUEST});
timoutPromise(5000, fetch('blah.com/data'))
.then(response => response.json())
.then(json => dispatch(getDataSuccess(json)))
.catch(
error => {
// Change this as necessary
dispatch({type: DATA_FETCH_FAILED});
console.log(error);
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果要向用户显示请求失败的信息,您可能希望使用该类型处理操作DATA_FETCH_FAILED.
| 归档时间: |
|
| 查看次数: |
6614 次 |
| 最近记录: |