restate / v1.0.0

Αξιόπιστο από τον σχεδιασμό

Τι εγγυάται το restate όταν η αποθήκευση είναι αργή, αποτυγχάνει ή λείπει, και πώς διαβάζετε τα σφάλματα που αναφέρει.

Σε αυτή τη σελίδαΕγγυήσειςΑποθηκεύσεις με σειράΔοκιμάστε τοΌταν αποτυγχάνει η φόρτωσηΑποθήκευση και κλείσιμοΗ αποθήκευση δεν είναι διαθέσιμηΕπικύρωση και μεταφορά αποθηκευμένων δεδομένωνΔική σας αποθήκευσηΌρια και χρονικά όριαΚωδικοί σφάλματος

Εγγυήσεις

Αυτή η συμπεριφορά είναι μέρος του συμβολαίου 1.0 και καλύπτεται από τα τεστ του πακέτου.

ΠερίστασηΤι κάνει το restate
Πολλές αποθηκεύσεις στη σειράΤις εκτελεί με σειρά ανά store· μια αποθήκευση στην ουρά γράφει την πιο πρόσφατη τιμή.
Μια εγγραφή δεν φορτώθηκεΤο autoSave και οι μαζικές αποθηκεύσεις την παρακάμπτουν με LOAD_FAILED· μόνο ένα ρητό save() την αντικαθιστά.
Το component αποπροσαρτάται κατά την αποθήκευσηΗ αποθήκευση που ζητήθηκε ολοκληρώνεται· οι μεταγενέστερες εγγραφές στο καταστραμμένο store αγνοούνται.
Η αποθήκευση δεν είναι διαθέσιμηΤο store τρέχει στη μνήμη, το status().available είναι false και οι αποθηκεύσεις απορρίπτονται.
Ένας προσαρμογέας κολλάειΗ λειτουργία λήγει μετά από operationTimeoutMs και η επόμενη εργασία περιμένει να τελειώσει ο προσαρμογέας.
Πάρα πολλή εκκρεμής εργασίαΟι νέες λειτουργίες απορρίπτονται με QUEUE_FULL αντί να μεγαλώνουν χωρίς όριο.

Αποθηκεύσεις με σειρά

Οι λειτουργίες ενός store δεν επικαλύπτονται ποτέ. Μια αποθήκευση που ξεκινά ενώ περιμένει άλλη παίρνει την πιο πρόσφατη τιμή, οπότε η αποθήκευση σε κάθε αλλαγή γράφει την τελευταία κατάσταση χωρίς να γεμίζει την ουρά.

JavaScript / JSX
useDraft.set('A');
const first = useDraft.save(); // writes "A"
useDraft.set('B');
const second = useDraft.save(); // waits in the queue
useDraft.set('C');
const third = useDraft.save(); // joins the waiting save

await Promise.all([first, second, third]); // ['A', 'C', 'C'] — two writes

Δοκιμάστε το

Επιβραδύνετε την αποθήκευση, κάντε τις εγγραφές να αποτυγχάνουν ή αφαιρέστε εντελώς την αποθήκευση.

Προετοιμασία παραδείγματος…

Όταν αποτυγχάνει η φόρτωση

Το restateManager.ready απορρίπτεται με BULK_OPERATION_FAILED και απαριθμεί κάθε store που απέτυχε. Μέχρι να φορτωθεί εκείνη η εγγραφή, τα autoSave και saveAll δεν την αντικαθιστούν και αναφέρουν LOAD_FAILED.

Δοκιμάστε ξανά με initialize() για να κρατήσετε τις αλλαγές και να τις αποθηκεύσετε, καλέστε restore() για να τις απορρίψετε, ή save() για να αντικαταστήσετε σκόπιμα την εγγραφή.

JavaScript / JSX
try {
  await restateManager.ready;
} catch (error) {
  // BULK_OPERATION_FAILED: one entry per store that could not load.
  for (const { store, error: cause } of error.failures) {
    console.error(store.key, cause.code);
  }
}

Αποθήκευση και κλείσιμο

Μια αποθήκευση που ζητήθηκε πριν από την αποπροσάρτηση ολοκληρώνεται ούτως ή άλλως, οπότε ο χειριστής «Αποθήκευση και κλείσιμο» δεν χρειάζεται να περιμένει.

JavaScript / JSX
function Document({ onClose }) {
  const useDraft = useRestateScope((scope) => persistedRestate('', { scope, key: 'draft' }));

  const saveAndClose = () => {
    useDraft.save(); // finishes even after this component unmounts
    onClose();
  };
  // …
}

Η αποθήκευση δεν είναι διαθέσιμη

Η απόδοση στον διακομιστή και η αποθήκευση που μπλοκάρει το πρόγραμμα περιήγησης δεν είναι σφάλματα εκκίνησης. Ελέγξτε το available για να πείτε στους χρήστες ότι οι αλλαγές μένουν μόνο στη μνήμη.

JavaScript / JSX
const { available } = useDraft.status();

if (!available) {
  // Server rendering or blocked browser storage: the store works in memory
  // and save() rejects with STORAGE_UNAVAILABLE.
  showNotice('Changes are kept until you close this tab.');
}

Επικύρωση και μεταφορά αποθηκευμένων δεδομένων

Τα version, migrate και validate σας προστατεύουν από παλιές ή κατεστραμμένες εγγραφές. Το validate εκτελείται πριν από την αποθήκευση και μετά την ανάκτηση ή τη μεταφορά.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

const useSettings = persistedRestate(
  { theme: 'system' },
  {
    key: 'settings',
    version: 2,
    migrate(value, from, to) {
      if (from === 1 && to === 2 && typeof value?.darkMode === 'boolean') {
        return { theme: value.darkMode ? 'dark' : 'light' };
      }
      throw new Error('Unsupported stored version');
    },
    validate: (value) => ['system', 'light', 'dark'].includes(value?.theme),
  },
);

Δική σας αποθήκευση

Κάνει οποιοδήποτε αντικείμενο με getItem, setItem και removeItem. Οι μέθοδοι μπορούν να επιστρέφουν τιμές ή Promise· το isAvailable είναι προαιρετικό.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

const sessionStorageAdapter = {
  isAvailable: () => typeof sessionStorage !== 'undefined',
  getItem: (key) => sessionStorage.getItem(key),
  setItem: (key, value) => sessionStorage.setItem(key, value),
  removeItem: (key) => sessionStorage.removeItem(key),
};

export const useFilters = persistedRestate(
  { query: '' },
  {
    key: 'filters',
    storage: sessionStorageAdapter,
  },
);

Όρια και χρονικά όρια

Ορίστε πόσο μπορεί να διαρκέσει μια λειτουργία, πόσες μπορούν να περιμένουν και πόσο μεγάλη μπορεί να είναι μια τιμή.

JavaScript / JSX
persistedRestate(value, {
  key: 'draft',
  operationTimeoutMs: 10_000, // default 30000
  maxPendingOperations: 64, // default 256
  maxStorageCharacters: 1_000_000,
});

Κωδικοί σφάλματος

Τα σφάλματα που δημιουργεί το restate έχουν name RestateError, code και, στα αποθηκευμένα stores, key. Οι προσαρμογείς αποθήκευσης και τα callbacks σας μπορούν να απορρίψουν με δικά τους σφάλματα.

ΚωδικόςΣημασία
BULK_OPERATION_FAILEDΜια μαζική κλήση όπως το restateManager.ready ή το saveAll είχε αποτυχίες· δείτε το error.failures.
INDEXEDDB_ABORTEDΜια συναλλαγή IndexedDB ματαιώθηκε.
INDEXEDDB_BLOCKEDΤο άνοιγμα της βάσης δεδομένων μπλοκαρίστηκε από σύνδεση σε άλλη καρτέλα.
INDEXEDDB_CONNECTION_CLOSINGΗ σύνδεση με τη βάση δεδομένων έκλεινε όταν ξεκίνησε το αίτημα.
INDEXEDDB_OPEN_FAILEDΔεν ήταν δυνατό να ανοίξει η βάση δεδομένων.
INDEXEDDB_REQUEST_FAILEDΈνα αίτημα IndexedDB απέτυχε.
INDEXEDDB_STORE_MISSINGΑπό την ήδη υπάρχουσα βάση δεδομένων λείπει το object store.
INVALID_STORAGE_RECORDΗ αποθηκευμένη εγγραφή δεν είναι έγκυρη εγγραφή restate.
INVALID_STORED_VALUEΗ τιμή δεν πέρασε το validate.
LIFECYCLE_LIMITΈνας updater ξεκινούσε και σταματούσε επανειλημμένα.
LOAD_FAILEDΗ εγγραφή δεν φορτώθηκε, οπότε η αυτόματη ή μαζική αποθήκευση δεν την αντικατέστησε.
MMKV_UNAVAILABLEΔεν φορτώθηκε το react-native-mmkv.
MULTIPLE_ERRORSΠολλά callbacks απέτυχαν σε μία λειτουργία· δείτε το error.errors.
NOTIFICATION_LIMITΟι observers προγραμμάτιζαν συνεχώς αλλαγές σε βρόχο.
OBSERVER_ERRORΈνας listener ή ένα callback κύκλου ζωής πέταξε σφάλμα.
OPERATION_ABORTEDΜια λειτουργία αποθήκευσης ακυρώθηκε.
QUEUE_FULLΠερίμεναν περισσότερες λειτουργίες από όσες επιτρέπει το maxPendingOperations.
REENTRANT_SETTERΈνας updater κατάστασης προσπάθησε να αλλάξει το ίδιο store ενώ εκτελούνταν.
SCOPE_DESTROYEDΈνα καταστραμμένο scope χρησιμοποιήθηκε για τη δημιουργία stores.
SEQUENCE_EXHAUSTEDΜια εσωτερική ακολουθία εξάντλησε τα αναγνωριστικά της.
STORAGE_BLOCKEDΜια προηγούμενη κλήση του προσαρμογέα δεν ολοκληρώθηκε μετά από λήξη χρόνου ή ακύρωση.
STORAGE_TIMEOUTΜια λειτουργία διήρκεσε περισσότερο από operationTimeoutMs.
STORAGE_UNAVAILABLEΗ αποθήκευση δεν μπορεί να χρησιμοποιηθεί εδώ· το store συνεχίζει να τρέχει στη μνήμη.
STORAGE_VALUE_TOO_LARGEΗ κωδικοποιημένη τιμή υπερβαίνει το maxStorageCharacters.
STORAGE_VERSION_MISMATCHΗ εγγραφή έχει διαφορετική έκδοση και καμία συνάρτηση migrate δεν τη χειρίζεται.
STORE_DESTROYEDΈγινε συνδρομή σε καταστραμμένο store ή ζητήθηκε από αυτό να χρησιμοποιήσει αποθήκευση.

Αναζήτηση στην τεκμηρίωση

Αναζήτηση σε τίτλους, περιγραφές και περιεχόμενο όλων των οδηγών.