Как сохранить карту с использованием AsyncStorage в React-Native?

#javascript #android #react-native #mobile #asyncstorage

#javascript #Android #react-native #Мобильный #asyncstorage

Вопрос:

 import * as React from 'react';

let paths = new Map();
  
export function AddPath(path) {
    if (paths.has(path)){
        return
    }
    else{
        paths.set(path, false);
    }

}

export function CompletedPath(path) {
    paths.set(path, true);
}
  

Приведенный выше мой код выглядит как обычно. Он функционирует так, как ожидалось. Я создаю карту с именем paths для хранения некоторых важных данных. Его значения либо истинны, либо ложны, а его ключи являются объектами JSON.
Что мне нужно сделать, это сохранить эту карту в асинхронное хранилище, чтобы ее можно было извлечь, когда я снова открою приложение после его закрытия.
Это моя текущая попытка изменить мой код:

 import * as React from 'react';
import AsyncStorage from '@react-native-community/async-storage';

let paths = new Map();

const getData = async () => {
    try {
      const jsonValue = await AsyncStorage.getItem('Map')
      let paths = JSON.parse(jsonValue);
    } catch(e) {
      // error reading value  
    }
    alert(paths)
}

const storeData = async (data) => {
    try {
      const jsonValue = JSON.stringify(data)
      await AsyncStorage.setItem('Map', jsonValue)
    } catch (e) {
      // saving error
    }
}

getData();
  
export function AddPath(path) {
    if (paths.has(path)){
        return
    }
    else{
        paths.set(path, false);
        storeData(paths);
    }

}

export function CompletedPath(path) {
    paths.set(path, true);
    storeData(paths);
}
  

Я создаю карту путей как обычно, а затем вызываю getData(), чтобы проверить, существует ли карта уже в asyncstorage. Затем, где бы я ни обновлял карту раньше, я также обновлю асинхронное хранилище.

Однако я не могу заставить ее работать. Карта «пути» всегда отображается как пустая, когда я снова открываю приложение.

Может ли быть проблема с тем, как я сохраняю пути к asyncstorage, потому что это карта, а не объект JSON?

Есть идеи?

Ответ №1:

Если вы сделаете это JSON.stringify с Map помощью, она будет преобразована в {}.

Конвертируйте MAP в Array и используйте stringify .

 const map = new Map();
map.set('test',true);
console.log(JSON.stringify(map));
console.log(JSON.stringify(Array.from(map.entries())));  

Stringify

 const jsonValue = JSON.stringify(Array.from(data.entries()));
  

Разбор

 let paths = new Map(JSON.parse(jsonValue));