2016-10-29 60 views
0

我正在使用laravel(php)后端进行react-native项目。我有一个类AuthService与方法登录(用户名,密码),它返回一个promoise,解决用户和拒绝错误。这些错误将在JSON中进行响应,以便我可以向用户显示特定的错误,但是由于可能会发生意外错误,我还希望为使用组件提供一个json对象。Promise拒绝为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

。于是((响应)=> {})时的承诺最终成功地(带解析()函数),所以你不应该叫决心功能则()函数调用。

.catch((ERR)=> {})时的承诺失败(与拒绝()函数)称为

你需要做的是在随后处理成功响应并处理捕获失败。

.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"]}); 
    }); 

如果你想控制的决心和拒绝,你可以使用“请求”,而不是取

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

+0

感谢您的答复,但提取API没有按不提供解析回调,它只提供响应对象。我怎样才能继续使用拒绝和解决? @Burak Karasoy –

+0

@DesterDezzods答案更新。你可以使用另一个组件,比如'require'它提供了解析和拒绝。 –

+0

或者使用'fetch'并抛出错误。 – NiFi

相关问题