我正在发出此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不是函数
请告知
答案 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)
}
}