2
votes

Comment utiliser localForage de manière synchrone

J'ai une application mobile Cordova qui stocke les données hors connexion dans localStorage. Récemment, les utilisateurs ont commencé à recevoir une erreur QUOTA_EXCEEDED_ERR car localStorage a une limite de 5 Mo. J'ai décidé d'utiliser le framework "localForage", mais j'ai remarqué qu'il fonctionne de manière asynchrone. Puisque je ne veux pas réécrire toutes mes applications complexes en enveloppant dans des fonctions de rappel, je voulais savoir s'il existe un moyen d'utiliser "localForage" de manière synchrone (attendez que la fonction getItem renvoie la valeur).

Voici un exemple de code que je j'essaye de faire:

localforage.setItem('testKey', 'testValue', function() {
  var value = getValue('testKey');

  console.log(value); // here I get undefined, but I want to get a value
});

function getValue(key) { // I want this function to return value
  var result;
    localforage.getItem(key, function(value) {
    result = value;
  });

  return result;
}

Je veux que getValue () renvoie une valeur sans changer aucun autre code


0 commentaires

4 Réponses :


-2
votes

Je n'ai pas testé cela et n'ai aucune expérience avec localForage, mais je suppose que si vous définissez votre résultat sur la valeur de retour du rappel et le renvoyez, c'est ce que vous recherchez

function getValue(key) { 
  var result = localforage.getItem(key, function(err, value) {
    return value;
  });
  return result;
}


4 commentaires

De cette façon, localforage renvoie une promesse


voir ma mise à jour, les rappels dans localForage sont de style Node (argument d'erreur en premier)


aucune de ces méthodes ne fonctionne car le fourrage local renvoie Promise. jsfiddle.net/tLd6z805


Vraiment? Je ne fais pas de mise à jour. :) La méthode JSON.parse ne fonctionne pas non plus.



0
votes

Selon ce lien

localForage a une double API qui vous permet soit d'utiliser le style Node rappels ou promesses. Si vous n'êtes pas sûr de celui qui vous convient, il est recommandé d'utiliser les promesses.

Vous pouvez donc utiliser n'importe lequel d'entre eux si vous le souhaitez. si vous utilisez des promesses, vous pouvez utiliser async / await pour attendre le résultat

localforage.setItem('testKey', 'testValue', async function() {
  var value = await getValue('testKey')

  console.log(value); // here I get undefined, but I want to get a value
});

 async function getValue(key) { 
  var result = await localforage.getItem(key);
  return result;
}

jsfiddle


3 commentaires

J'ai essayé de cette façon mais cela ne fonctionne pas non plus: /. Voir: jsfiddle.net/kqf5xvz7


Ouais, mais maintenant je dois changer toutes les fonctions qui appellent getValue à async. Je veux changer un endroit et ne pas casser cette vieille application fragile :)


Je ne pense pas qu'il y ait un autre moyen. En raison de la nature async , vous devez arrêter le code d'avancer à moins que vous ne disposiez des données et pour cela, vous devez utiliser des callbacks ou async / await < / code>



0
votes
localforage.setItem('testKey', 'testValue', async function() {//declare function as async
  var value = await getValue('testKey'); //wait for the value

  console.log(value); // "testValue" value should show in console
});

//declare function as async
async function getValue(key) {
  var result = await localforage.getItem(key); //wait for the localforage item

  return result;
}
JSFiddle here: https://jsfiddle.net/mvdgxorL/

0 commentaires

0
votes

https://localforage.github.io/localForage/#data-api -getitem , utilisez async/await:

try {
    const value = await localforage.getItem('somekey');
    // This code runs once the value has been loaded
    // from the offline store.
    console.log(value);
} catch (err) {
    // This code runs if there were any errors.
    console.log(err);
}


0 commentaires