我正在使用laravel(php)后端处理一个反应原生的项目。我有一个类'AuthService',方法登录(用户名,密码),它返回一个promoise,解析用户并拒绝错误。错误将以JSON格式响应,以便我可以向用户显示特定错误,但由于可能发生意外错误,我还想为消费组件提供json对象。
return fetch(Config.AUTH_URL, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: email, //provided
password: password //provided
})
})
.then(response=> {
if (response.ok) {
return response.json().then(user=> {
console.log(user);
AsyncStorage.setItem('auth.token', user.api_token);
AsyncStorage.setItem('user_name', user.user.name);
AsyncStorage.setItem('user_email', user.user.email);
})
} else {
if (response.status == 422) {
//this needs to be rejected, but gives error
return Response.reject(response.json());
} else {
//when the response from server is unexpected error (eg. 500 without json data),I still want to reject with a json object
return Promise(null, ()=> {
return {"email": ["Technical problem, try later"]}
});
}
}
}, err=> {
throw Error({"email": ["Technische fout. Probeer het opnieuw"]});
});
答案 0 :(得分:0)
.then((response)=> {})在promise成功结束时(使用resolve()函数)被调用,因此你不应该在then()函数中调用resolve函数。
当承诺失败时,会调用.catch((err)=> {})(使用reject()函数)
你需要做的是在当时处理成功的响应并处理catch中的失败。
.then(response=> {
if (response.ok) {
return response.json().then(user=> {
console.log(user);
AsyncStorage.setItem('auth.token', user.api_token);
AsyncStorage.setItem('user_name', user.user.name);
AsyncStorage.setItem('user_email', user.user.email);
})
} else {
if (response.status == 422) {
return response.json();
} else {
return {"email": ["Technical problem, try later"]}
}
}
} .catch(function (err) {
return ({"email": ["Technische fout. Probeer het opnieuw"]});
});
如果您想控制解决和拒绝,可以使用'request'而不是fetch
var request = require('request');
function getUserData() {
return new Promise(function(resolve, reject) {
request('http://......', function(error, response, body) {
if (error) return reject(error);
resolve(body);
});
});
}
async function main() {
try {
var response= await getUserData();
console.log(response);
} catch(error) {
console.error(error);
}
}
看看这个博客 https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html