React native中的承诺

时间:2018-06-29 01:12:56

标签: javascript reactjs react-native promise

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返回到调用函数的位置,而不是返回该位置的数据:

actions / 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))

所以我的问题是因为它为false,所以它没有输入到getDataSuccess中。我不知道为什么它不能将数据发送到此函数,并且最终发送了fetching = false的结果。

1 个答案:

答案 0 :(得分:2)

您需要另一个.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()
    })
}