2016-11-04 2 views
1

У меня есть запрос на выборку.Как я могу получить значение ошибки внутри объекта Promise, который возвращается из Fetch Api?

fetch(deafaultUrl + '/v1/users/', 
     { 
      headers: { 
       'Content-Type': 'application/json' 
      }, 
      method: "POST", 
      body: JSON.stringify(userInfoParams) 
     }) 
     .then(function(response) { 
      console.log(response); 
      console.log(response.json()); 

      // not working never go into this function 
      response.json().then(function(value) { 
       console.log('access promise'); 
       console.log(value); // "Success" 
      }); 

      if (response.status !== 200 && response.status !== 201) { 
       throw new Error("Bad response from server"); 
      } 
     }) 
     .then(function(json){ 

      console.log("succeed json re"); 
      console.log(json); 
      dispatch(update_user(json)); 

     }) 

Так что, когда я утешать этот console.log(response.json());

Я получил эту

enter image description here

Но, похоже, функция Promise оленьей кожи тренировки.

Как я могу получить ошибки Объект внутри [[PromiseValue]]?

Спасибо!

+0

Почему двойной 'затем'? – Weedoze

ответ

1

Вот документация then(...)

Вы должны использовать его как это:

p.then(function(value) { 
    // fulfillment 
    }, function(reason) { 
    // rejection 
}); 

Тогда ваш код будет выглядеть следующим образом

fetch(deafaultUrl + '/v1/users/', { 
     headers: { 
      'Content-Type': 'application/json' 
     }, 
     method: "POST", 
     body: JSON.stringify(userInfoParams) 
    }) 
    .then(function(response) { 
     //Land here if request is successful 
     console.log(response); 

     if (response.status !== 200 && response.status !== 201) { 
      throw new Error("Bad response from server"); 
     } 
    }, function(error){ 
     //Land here if request has an error 
     console.log(error); 
    }); 
+0

Это не работает, даже я получил ответ «422», который он по-прежнему входит в первый блок, а не второй. – user3403614

+0

Проверьте, что такое ошибка '422'. Ошибка в вашем вызове – Weedoze

0

Я нашел решение, которое response.json() может только прочитайте один раз, если я получу console.log(response.json());, он отлично работает.

+0

Это правильно. Если вы хотите прочитать его несколько раз, вам нужно клонировать ответ (https://developer.mozilla.org/en-US/docs/Web/API/Response/clone). Кстати, это не самый быстрый способ его регистрации. console.log (response.json()) записывает обещание, возвращаемое функцией json(), но вы хотите записать результат, поэтому response.json(). then (data => console.log (data)). – Marco

2

Чтобы получил ошибку обещания, вы можете сделать, как это

promise.then(function(data) { 
    }, function(error) {...} 

ИЛИ

Чтобы получил ошибку обещания вы можете также использовать .catch() блок

.then(){...} 
.catch(){..} 

Никогда не собираются этого частично, потому что сервер уже отправил ответ

.then(function(response) { 
      console.log(response); 
      console.log(response.json()); 

      // not working never go into this function 
      response.json().then(function(value) { 
       console.log('access promise'); 
       console.log(value); // "Success" 
      }); 

Вы можете написать свой код таким образом:

fetch(deafaultUrl + '/v1/users/', { 
     headers: { 
      'Content-Type': 'application/json' 
     }, 
     method: "POST", 
     body: JSON.stringify(userInfoParams) 
    }) 
    .then(function(response) { 
     // if request is successful 
    } 
    .catch(err){ 
     // if got error 
    } 
    }); 
Смежные вопросы