在if语句中使用.then来解析JSON

时间:2019-05-15 06:51:08

标签: javascript

我正在发出此api请求,该检查是在if语句内执行的,如何在不执行另一个请求的情况下包含then json()?

  database = () => {
    const { currentUser } = fire.auth();
    console.log('loading ...');
    var url = 'https://api.com./' + currentUser.email;
    fetch(url)
      .then(response => {
        if (response.status === 404) {
          console.log(response.status);
          console.log('denied');
        }
        else if (response.status === 200) {
          fetch(url)
            .then(promise => promise.json())
            .then(data => {
              console.log(data)
            })
        }
        else {
          console.log('?')
        }
      });
  }

我尝试使用response.json(),但是东西被包装在一个Promise中,无法访问格式化的数据。

  

未处理的拒绝(TypeError):response.then不是函数

请告知

2 个答案:

答案 0 :(得分:3)

一个更好的选择是throw错误而不是记录错误,从而破坏then链:

url = 'https://jsonplaceholder.typicode.com/todos/1';

fetch(url)
  .then(response => {
    if (response.status === 404)
      throw new Error('not found');
    if (response.status !== 200)
      throw new Error('error');
    return response.json()
  })
  .then(data => console.log('ok', data))
  .catch(err => console.log('error', err.message));

您还可以为此创建通用函数并使用它,而不是一直使用fetch

function fetchOrFail(url, opts) {
    return fetch(url, opts)
        .then(r => {
            if (r.status !== 200)
                throw new Error('fetch error ' + r.status);
            return r;
        })
}

答案 1 :(得分:1)

也许您可以尝试使用async-await。使您的代码更简洁,更短。

const database = async() => {
    console.log('loading ...');
    var url = 'http://dummy.restapiexample.com/api/v1/employees';
    let response = await fetch(url)
        if (response.status === 404) {
          console.log(response.status);
          console.log('denied');
        } 
        else if (response.status === 200) {
          const data = await response.json()
          console.log(data)
        }
  }