Синглтон AsyncStorage в React Native

Я хочу создать синглтон, который будет собирать все данные, которые мне нужны для приложения. Возможно, это неправильный подход, поправьте меня, пожалуйста.

Прямо сейчас мой класс Singleton имеет простой код:

import { AsyncStorage } from 'react-native'

export default class DataManager {
    static myInstance = null

    stringsArray = null

    static instance() {
        if (DataManager.myInstance == null) {
            DataManager.myInstance = new DataManager();
        }

        return this.myInstance;
    }

    async getStringsArray() {
      if (this.stringsArray == null) {
        let strings = await AsyncStorage.getItem('stringsArray')
        this.stringsArray = JSON.parse(strings)
      }
        return this.stringsArray
    }

    async setStringsArray(strings) {
        this.stringsArray = strings;
        await AsyncStorage.setItem('stringsArray', JSON.stringify(strings))
    }
}

Вот как я хочу называть геттеры и сеттеры:

DataManager.instance().setStringsArray(["abc", "def"])

let stringsArray = DataManager.instance().getStringsArray()

К сожалению, если я что-то установил, то не смогу получить это позже. Буду рад помочь в этом случае


person Dzeremix    schedule 02.09.2019    source источник
comment
Вы думали об использовании объекта вместо класса? Я считаю, что это наиболее простой способ реализации шаблона singleton в JS.   -  person Orangel Marquez    schedule 02.09.2019
comment
Я сделаю это ????. Прямо сейчас я пытаюсь уточнить свои знания о JS. Спасибо!   -  person Dzeremix    schedule 02.09.2019
comment
async всегда возвращает обещание. Так что либо let stringsArray = await ..., либо getStringsArray().then(stringsArray => ...)   -  person slebetman    schedule 02.09.2019
comment
Кроме того, я бы счел это антипаттерном. Правильный способ реализации синглтона - export default new DataManager(), потому что все модули уже являются синглетонами.   -  person slebetman    schedule 02.09.2019


Ответы (2)


Я думаю, вы хотите сохранить некоторые параметры на своем AsyncStorage, но вы не хотите каждый раз импортировать их и использовать для сохранения параметров в памяти телефона. Обычный способ для приложений, поддерживающих реакцию, - использовать redux-persist библиотеку. Используя эту библиотеку, вы можете сохранить каждый параметр, который есть в вашем хранилище redux. Подробнее об этом можно прочитать здесь, https://github.com/rt2zz/redux-persist. . Вы можете поместить любой параметр в redux-persist whitelist, и он будет сохранен в памяти вашего телефона.

Надеюсь, это решит вашу проблему. Если это было ваше желаемое решение, проголосуйте за меня :)

person Meisam Nazari    schedule 02.09.2019

Если вы ищете способы обмена данными между различными компонентами или через приложение, попробуйте redux https://blog.cloudboost.io/getting-started-with-react-native-and-redux-6cd4addeb29

person Milind Agrawal    schedule 02.09.2019
comment
Я хочу каждый момент сохранять данные локально на устройстве. Я думаю, что redux - это нечто другое. - person Dzeremix; 02.09.2019
comment
В таком случае попробуйте две библиотеки из React Native. npmjs.com/package/react-native-simple-store, При участии Native npmjs.com/package/react-native-shared-preferences - person Milind Agrawal; 02.09.2019