2016-05-31 2 views
3

Я пытаюсь найти хороший способ обработки ответов HTTP, которые я считаю ошибкой. Я использую fetch в React Native. Вот мой код.HTTP Promise - Обработка ошибок

loginRequest(url) { 
    return fetch(url, { 
    method: 'post', 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded;' 
    }, 
    .... 
    }) 
    .then(response => { 
    return this.processResponse(response); 
    }); 
} 

Тогда ...

processResponse(response) { 
    if (response.status === 200) { 
     return response.json(); 
    } else { 
     let error = new Error(response.status); 
     error.response = response.json(); // This is the problem 
     error.status = response.status; 
     throw error; 
    } 
    }, 

И выше, называются так:

return ApiRequests.loginRequest(username, password) 
     .then(json => { 
     dispatch(Actions.loginSuccess(json, username, password)); 
     }) 
     .catch(error => { 
     dispatch(Actions.loginFailure(error)); 
     }); 
    }; 

Идея заключается в том, что я могу легко обрабатывать все ошибки отдельно (мы предполагаем ничего, кроме 200), в пределах улова. Проблема в том, что response.json() возвращает обещание, поэтому присваивание ему ошибки. Ответ не работает. Мне нужно отслеживать код статуса http и тело ответа.

+0

Вместо того, чтобы бросать ошибку, попытайтесь отклонить обещание может быть, как: 'Promise.reject (новый Error (response.statusText))', https: // разработчик. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject – Cherniv

+0

Будет ли это проверено спасибо – Giannis

ответ

4

Как об этом:

processResponse(response) { 
    if (response.status === 200) { 
    return response.json(); 
    } else { 
    return response.json().then((data) => { 
     let error  = new Error(response.status); 
     error.response = data; 
     error.status = response.status; 
     throw error; 
    }); 
    } 
} 
+0

Ах всегда не обнимать их. Это имеет смысл – Giannis