2016-08-21 74 views
0

現在我想在用戶登錄成功後保存用戶令牌。React Native獲取異步存儲返回未處理的承諾

這裏是我的代碼:

onPress(){ 
    return axios.post('https://api.example.net/v1/user/auth/login', { 
    email: this.state.email, 
    password: this.state.password, 
    }, { 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
    }, 
    }).then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
     console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
    }) 
    .catch((error) => { 
     this.setState({errorMessage: error.response.data.message}); 
    }); 
} 

我已經確保response.data.login._cxz有一個值。 直到這裏工作。登錄將把我重定向到tweets路線。

在我tweets.js:

constructor(props){ 
    super(props); 
    this.state({token : ''}); 
    } 
    componentWillMount() { 
    AsyncStorage.getItem('token', (err, value) => { 

     console.log(value); 
    }) 
    } 

我只是簡單的console.log它來查看如果令牌沒有被保存。 但每次登錄完成(成功登錄都會顯示)。

error

任何解決方案:當進入我的微博,我總是得到這個錯誤?

謝謝。

回答

1

什麼是最有可能發生的是,then回調在navigator.immediatelyResetRouteStack拋出一個錯誤:

.then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
    console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
}) 
.catch((error) => { 
    this.setState({errorMessage: error.response.data.message}); 
}); 

那麼錯誤是夾在catch塊,但由於誤差是正常的JavaScript Error而不是axios錯誤,它沒有response屬性,因此試圖訪問error.response.data會導致未定義的錯誤。

最簡單的方法來檢測錯誤的類型是鴨式吧:如果錯誤有response,那麼它是一個愛可信錯誤,否則另一個錯誤:

.catch((error) => { 
    if (error.response && error.response.data) { 
    this.setState({errorMessage: error.response.data.message}); 
    } else { 
    this.setState({errorMessage: error.message}); 
    } 
}); 

造成immediatelyResetRouteStack的錯誤是可能來自在同一個調用堆棧上同步執行的React渲染過程。一旦你修復損壞.catch你會看到錯誤消息是什麼,但一個很好的猜測爲您有限的代碼樣本中的罪魁禍首是:

this.state({token : ''}); 

這應該是一個屬性賦值,而不是一個方法調用:

this.state = {token : ''}; 
+0

好吧,這一切都有道理。我嘗試刪除我的'catch'及其所有正常工作,但是在我修復this.state = {token:''}'後。謝謝! – ssuhat