restate / v1.0.0

Fiabil prin design

Ce garantează restate când stocarea e lentă, eșuează sau lipsește și cum se citesc erorile pe care le raportează.

Pe această paginăGaranțiiSalvări în ordineÎncercațiCând încărcarea eșueazăSalvează și închideStocarea nu e disponibilăValidarea și migrarea datelor salvateStocare proprieLimite și timpi de expirareCoduri de eroare

Garanții

Acest comportament face parte din contractul 1.0 și este acoperit de testele pachetului.

SituațieCe face restate
Mai multe salvări una după altaLe rulează în ordine pentru fiecare store; o salvare din coadă scrie cea mai nouă valoare.
O înregistrare nu s-a încărcatautoSave și salvările în bloc o omit cu LOAD_FAILED; doar un save() explicit o înlocuiește.
Componenta se demontează în timpul salvăriiSalvarea cerută se încheie; scrierile ulterioare în store-ul distrus sunt ignorate.
Stocarea nu e disponibilăStore-ul rulează în memorie, status().available este false, iar salvările sunt respinse.
Un adaptor se blocheazăOperațiunea expiră după operationTimeoutMs, iar lucrul următor așteaptă ca adaptorul să termine.
Prea mult lucru în așteptareOperațiunile noi sunt respinse cu QUEUE_FULL în loc să crească fără limită.

Salvări în ordine

Operațiunile unui store nu se suprapun niciodată. O salvare care pornește cât alta așteaptă preia cea mai nouă valoare, așa că salvarea la fiecare schimbare scrie ultima stare fără a umple coada.

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

Încercați

Încetiniți stocarea, faceți scrierile să eșueze sau eliminați stocarea cu totul.

Se pregătește exemplul…

Când încărcarea eșuează

restateManager.ready este respins cu BULK_OPERATION_FAILED și listează fiecare store care a eșuat. Până se încarcă acea înregistrare, autoSave și saveAll nu o înlocuiesc și raportează LOAD_FAILED.

Reîncercați cu initialize() pentru a păstra modificările și a le salva, apelați restore() pentru a renunța la ele sau save() pentru a suprascrie intenționat înregistrarea.

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);
  }
}

Salvează și închide

O salvare cerută înainte de demontare se încheie oricum, așa că handlerul „Salvează și închide” nu trebuie să aștepte.

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

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

Stocarea nu e disponibilă

Randarea pe server și stocarea blocată de browser nu sunt erori de pornire. Verificați available ca să le spuneți utilizatorilor că modificările rămân doar în memorie.

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.');
}

Validarea și migrarea datelor salvate

version, migrate și validate vă protejează de înregistrări vechi sau corupte. validate rulează înainte de salvare și după restaurare sau migrare.

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),
  },
);

Stocare proprie

Merge orice obiect cu getItem, setItem și removeItem. Metodele pot returna valori sau Promise-uri; isAvailable este opțional.

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,
  },
);

Limite și timpi de expirare

Stabiliți cât poate dura o operațiune, câte pot aștepta și cât de mare poate fi o valoare.

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

Coduri de eroare

Erorile create de restate au name RestateError, un code și, pentru store-urile salvate, un key. Adaptoarele de stocare și callback-urile pot respinge cu propriile erori.

CodSemnificație
BULK_OPERATION_FAILEDUn apel în bloc precum restateManager.ready sau saveAll a avut eșecuri; vedeți error.failures.
INDEXEDDB_ABORTEDO tranzacție IndexedDB a fost abandonată.
INDEXEDDB_BLOCKEDDeschiderea bazei de date a fost blocată de o conexiune din altă filă.
INDEXEDDB_CONNECTION_CLOSINGConexiunea la baza de date se închidea când a pornit cererea.
INDEXEDDB_OPEN_FAILEDBaza de date nu a putut fi deschisă.
INDEXEDDB_REQUEST_FAILEDO cerere IndexedDB a eșuat.
INDEXEDDB_STORE_MISSINGBaza de date existentă nu are object store-ul.
INVALID_STORAGE_RECORDÎnregistrarea salvată nu este o înregistrare restate validă.
INVALID_STORED_VALUEValoarea nu a trecut de validate.
LIFECYCLE_LIMITUn updater a pornit și s-a oprit în mod repetat.
LOAD_FAILEDÎnregistrarea nu s-a putut încărca, deci salvarea automată sau în bloc nu a înlocuit-o.
MMKV_UNAVAILABLEreact-native-mmkv nu s-a putut încărca.
MULTIPLE_ERRORSMai multe callback-uri au eșuat într-o singură operațiune; vedeți error.errors.
NOTIFICATION_LIMITObservatorii au tot programat modificări într-o buclă.
OBSERVER_ERRORUn listener sau un callback de ciclu de viață a aruncat o eroare.
OPERATION_ABORTEDO operațiune de stocare a fost anulată.
QUEUE_FULLAșteptau mai multe operațiuni decât permite maxPendingOperations.
REENTRANT_SETTERUn updater de stare a încercat să modifice același store în timp ce rula.
SCOPE_DESTROYEDUn scope distrus a fost folosit pentru a crea store-uri.
SEQUENCE_EXHAUSTEDO secvență internă a rămas fără identificatori.
STORAGE_BLOCKEDUn apel anterior al adaptorului nu s-a încheiat după expirare sau anulare.
STORAGE_TIMEOUTO operațiune a durat mai mult decât operationTimeoutMs.
STORAGE_UNAVAILABLEStocarea nu poate fi folosită aici; store-ul continuă să ruleze în memorie.
STORAGE_VALUE_TOO_LARGEValoarea codificată depășește maxStorageCharacters.
STORAGE_VERSION_MISMATCHÎnregistrarea are altă versiune și nicio funcție migrate nu o tratează.
STORE_DESTROYEDCineva s-a abonat la un store distrus sau i-a cerut să folosească stocarea.

Căutați în documentație

Căutați în titlurile, descrierile și conținutul tuturor ghidurilor.