如何将setTimeout添加到使用redux的获取承诺?

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)

  • `fetch`返回一个promise,所以你不需要创建一个新的Promise:`let request = fetch('blah.com/data')...`然后`返回Promise.race [timeout,request] ... ` (5认同)

ama*_*ann 5

基于你提到的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.