обработать запрос сети не удалось в реагировать родной - PullRequest
0 голосов
/ 01 октября 2018

Я столкнулся с проблемой при использовании реагировать нативно API fetch.Много раз запрос получал сбой.У меня высокоскоростное соединение.но много раз это не удавалось.эта проблема происходит в Android, ios обоих.

const shoppingApi  = 'myserverlink';

async function Sendshoppinapi(data) {
    try {
        let response = await fetch(shoppingApi, {
            method: 'POST',
            headers: {
                'Accept': 'application/json',
                'content-type':'multipart/form-data'
            },
            body: data
        });
        let responseJson = await response.json();
        return responseJson;
    }
    catch (error) {
          Alert.alert(error.toString())
    }
}

export {Sendshoppinapi};

данные, которые я отправляю серверу в виде пост-запроса

  add_to_wishlist = (item,index) => {
        {
          let data = new FormData();
        data.append('methodName',       'add_to_wishlist');
        data.append('user_id',        global.userid)
        data.append('item_id',        this.props.navigation.state.params.itemid.toString())


        Sendshoppinapi(data).then((responseJson)=>{

          console.warn(responseJson);
          if(responseJson.responseCode == '200'){
            this.setState({fav:false})
            Alert.alert('SHOPPING','Item added to wishlist successfully.',[{text: 'OK',},],{ cancelable: false })

          }
          else{
            this.setState({fav:false})
            Alert.alert('SHOPPING','Item already .',[{text: 'OK',},],{ cancelable: false })
          }
        })}
      }

Ошибка, что при сбое запроса error

fullscreen

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Я процитировал ответ, который использовал для другого поста - однако я добавил await.

Вы можете проверить состояние вызова, чтобы определить, возможно, почему произошел сбой сетевого вызова.Попробуйте использовать ok fetch для проверки правильности ответа, например:

.then(function(response) {
    if (!response.ok) {
        //throw error
    } else {
       //valid response
    }
})

Использование await:

 let response = await fetch(url)
 if (response.ok) return await response.json()

Вы также можете получить доступ к статусу ответа, например:

response.status;

или также, statusText, например:

response.statusText;

оформить заказ ниже:

https://developer.mozilla.org/en-US/docs/Web/API/Response/statusText

https://developer.mozilla.org/en-US/docs/Web/API/Response/status

https://www.tjvantoll.com/2015/09/13/fetch-and-errors/

0 голосов
/ 01 октября 2018

Используйте функцию then () с обещаниями.(Запрошенный фрагмент кода)

fetch(shoppingApi, {
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'content-type':'multipart/form-data'
    },
    body: data
})
.then((resp) => {
    return resp.json()
})
.then((resp) => {
  //resp contains your json data
});

Вы также можете заставить свою функцию возвращать Promise и использовать ее с then ():

function sendShoppingApi(data) {
    return new Promise((resolve, reject) => {
        fetch(shoppingApi, {
            method: 'POST',
            headers: {
                'Accept': 'application/json',
                'content-type':'multipart/form-data'
            },
            body: data
        })
        .then((resp) => {
            return resp.json();
        })
        .then((resp) => {
            resolve(resp);
            
            /*
              you should also check if data is valid, if something went wrong
              you can reject the promise:
              
              if(!dataOK)
                  reject("error message");
            
            */
        });
    });
}

Так что теперь вы можете сделать что-то вроде этого:

sendShoppingApi(data)
.then((resp) => {
    //do stuff with your data
})
.catch((err) => {
    //handle error
});

ОБНОВЛЕНИЕ

можетбыть дубликатом этого: React Native fetch () Сбой сетевого запроса

...