承诺拒绝 json
Promise reject as json
我正在开发一个带有 laravel (php) 后端的 react-native 项目。我有一个 class 'AuthService' 方法登录(用户名,密码),其中 returns 一个促销,解析用户并拒绝错误。错误将在 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"]});
});
.then((response)=>{}) 在 promise 成功结束时被调用(使用 resolve() 函数)所以你不应该在 then() 函数中调用 resolve 函数。
.catch((err)=>{}) 在 promise 失败时被调用(使用 reject() 函数)
你需要做的是在 then 中处理成功的响应,在 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"]});
});
如果你想控制 resolve 和 rejects 你可以使用 '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
我正在开发一个带有 laravel (php) 后端的 react-native 项目。我有一个 class 'AuthService' 方法登录(用户名,密码),其中 returns 一个促销,解析用户并拒绝错误。错误将在 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"]});
});
.then((response)=>{}) 在 promise 成功结束时被调用(使用 resolve() 函数)所以你不应该在 then() 函数中调用 resolve 函数。
.catch((err)=>{}) 在 promise 失败时被调用(使用 reject() 函数)
你需要做的是在 then 中处理成功的响应,在 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"]});
});
如果你想控制 resolve 和 rejects 你可以使用 '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