承诺拒绝为json

时间:2016-10-29 13:07:12

标签: javascript react-native es6-promise fetch-api

我正在使用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"]});
        });

1 个答案:

答案 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