承诺拒绝 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