2017-01-04 11 views
5

Я использую fetch, чтобы вызвать некоторые вызовы API в реакции-native, иногда случайным образом выборка не запускает запросы на сервер, а мои тогда или только блоки не вызываются. Это случается случайным образом, я думаю, что может быть состояние гонки или что-то подобное. После неудачных запросов один раз так, запросы к одному API никогда не будут уволены, пока я не перезагружу приложение. Любые идеи, как проследить причину этого. Код, который я использовал, приведен ниже.реагировать на нативную выборку, не вызывая тогда, или улавливать

const host = liveBaseHost; 
const url = `${host}${route}?observer_id=${user._id}`; 
let options = Object.assign({ 
     method: verb 
    }, params 
    ? { 
     body: JSON.stringify(params) 
    } 
    : null); 
options.headers = NimbusApi.headers(user) 
return fetch(url, options).then(resp => { 
    let json = resp.json(); 
    if (resp.ok) { 
     return json 
    } 
    return json.then(err => { 
     throw err 
    }); 
}).then(json => json); 
+0

попробуйте добавить блок catch следующим образом: .catch (error => error) –

+0

Это происходит только при отладке в Chrome? Если это так, я могу быть связан с [этой проблемой] (https://github.com/facebook/react-native/issues/6679). Попробуйте добавить 'setTimeout (() => null, 0);' before 'resp.json()'. – ncuillery

+0

@ncuillery спасибо за ваш ответ, это происходит не только в хроме, это также происходит в тестовых сборках приложения. Я видел проблему, о которой вы упоминали, но моя была немного иной. В этом случае метод resp, json() блокируется, но в моем случае последующий блок никогда не выполняется, даже если метод выборки вызывается несколько раз. –

ответ

3

Извлечение может быть причиной ошибки, и вы не добавили блок catch. Попробуйте это:

return fetch(url, options) 
    .then((resp) => { 
    if (resp.ok) { 
     return resp.json() 
     .then((responseData) => { 
      return responseData; 
     }); 
    } 
    return resp.json() 
     .then((error) => { 
     return Promise.reject(error); 
     }); 
    }) 
    .catch(err => {/* catch the error here */}); 

Помните, что Обещания обычно имеют следующий формат:

promise(params) 
    .then(resp => { /* This callback is called is promise is resolved */ }, 
     cause => {/* This callback is called if primise is rejected */}) 
    .catch(error => { /* This callback is called if an unmanaged error is thrown */ }); 

Я использую его таким образом, потому что я столкнулся с той же проблемой раньше.

Сообщите мне, если это поможет вам.

+1

Спасибо за ваш ответ, на самом деле я возвращаю обещание от этого метода, и в другом методе, вызывающем это, у меня есть блок catch, который никогда не выполняется. –

+0

Вы пытались отладить его, чтобы увидеть, где находится ошибка (или посмотреть, где она останавливается)? Вы видели какие-либо ошибки в консоли (прикрепите их, если есть)? –

+0

Я не вижу, чтобы какая-либо ошибка была запущена, и никаких ошибок в консоли, это очень странно. –

0

Оберните fetch в примерки уловом:

let res; 
try { 
    res = fetch(); 
} catch(err) { 
    console.error('err.message:', err.message); 
} 

Если вы видите «ошибка сбой сети» это либо CORS или действительно смешно один, но он получил меня в прошлом, проверьте, что вы не находятся в режиме полета.