AsyncStorage.getItem в реагировать на родной не работает - PullRequest
0 голосов
/ 23 октября 2018

Я устанавливаю данные на сервере с помощью AsyncStorage.setItem и пытаюсь получить доступ к этому значению на другом экране с помощью AsyncStorage.getItem.1. Я не могу установить token в пределах AsyncStorage.2. Как мне установить несколько значений в asyncstorage, скажем, я хочу, чтобы user_id из ответа сервера был установлен вместе с этим token?

onPressRegister(){

            fetch('http://192.168.1.7:3000/users/registration',{
                method:'POST',
                headers:{
                    'Accept': 'applictaion/json',
                    'Content-Type': 'application/json',

                },
                body:JSON.stringify({
           contact:this.state.contact,
                     password:this.state.password,
                })
            })
            .then((response) => response.json())
            .then((responseData) =>
            {
                 this.setState({
                     signup: responseData
                 });
                 setTimeout(() => {
                    Actions.firstScreen();
                }, 2300);

        AsyncStorage.setItem('token' ,this.state.signup.token);
            });

    }

И я получаю вот так

  componentDidMount(){
    AsyncStorage.getItem('token').then((userid) =>{
    this.setState({'userid': userid});
    console.log(userid);
    });
}

Но я не вижу результата в console, ничего не получается.Есть ли какая-либо ошибка в AsyncStorage.setItem? Кроме того, ответ сервера выглядит следующим образом

{ error: 0,
  data: 'User registered Successfully',
  userData:
   { pwd: 'vgh',
     phone_no: '5',
     user_name: '',
     status: 1,
     date: 2018-10-23T09:23:53.671Z },
  user_id: [  { user_id: 5 } ],
  token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' }

Также я хочу, чтобы user_id был установлен в AsyncStorage.Как это сделать?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

U может использовать async и await для доступа к значению из AsyncStorage.

async componentDidMount(){
    let token = await AsyncStorage.getItem('token');
    console.log(token);
}
0 голосов
/ 23 октября 2018

Я думаю, что ваша проблема связана с асинхронным свойством setState.

Если ваш responseData является объектом (протестируйте его с console.log (typeof responseData), попробуйте:

AsyncStorage.setItem('token' , responseData.token);

Действительно, метод setState требует некоторого времени, чтобы быть эффективным. Реагирует на нативную установку состояния, когда это лучший момент, а не когда вы пишете его в своем коде (асинхронная функция). Это не похоже на набор переменных ..

Еще одна вещь, которую нужно знать, когда вы вызываете getItem. Если вы вызываете его сразу после setItem (или даже после перехода на другой экран), он не может быть уже установлен (та же причина асинхронности). Затем вы можете сделать это так:убедитесь, что ваш элемент установлен:

AsyncStorage.setItem('token' , responseData.token, () => { ...the next instructions (like navigation function) }); 

Это обратный вызов, вызываемый в конце метода setItem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...