使用Axios和Promises循环API调用

时间:2017-05-18 16:43:57

标签: javascript polling axios

我正在使用Axios进行API调用,对于一次调用,我想继续轮询API,直到我收到回复。

但是,当我调用此函数时,某些事情会比预期更早地解决。

我在这里调用函数:

componentDidMount() {
  api.getUser(this.props.user.id)
  .then((response) => {
    console.log(response);
    this.handleSuccess(response.content);
  })
  .catch((error) => {
    this.handleError(error);
  });
}

第4行的console.log显示undefined。该函数会继续轮询并在收到有效数据时停止。

功能本身:

getUser(id, retries = 0) {
  return axios(getRequestConfig)
  .then((res) => {
    if (res.data && res.data.content.status === 200) {
      return Promise.resolve(res.data); // success!
    } else if (retries >= 15) {
      return Promise.reject(res); // failure
    } else {
      // try again after delay
      delay(1000)
      .then(() => {
        return this.getUser(id, retries + 1);
      })
    }
  })
  .catch(err => err);
}

2 个答案:

答案 0 :(得分:5)

我将轮询逻辑分解为单独的功能:

//expects fn() to throw if it failed
//if it runs out of retries, poll() will resolve to an rejected promise, containing the latest error
function poll(fn, retries = Infinity, timeoutBetweenAttempts = 1000){
    return Promise.resolve()
        .then( fn )
        .catch(function retry(err){
            if(retries-- > 0)
                return delay( timeoutBetweenAttempts )
                    .then( fn )
                    .catch( retry );
            throw err;
        });
}



getUser(id) {
    function validate(res){
        if(!res.data || res.data.content.status !== 200) 
            throw res; 
    }
    return poll(() => axios(getRequestConfig).then(validate), 15, 1000);
}

答案 1 :(得分:1)

有一个库this section from the design document支持开箱即用的投票。