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
4 Réponses :
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; }
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.
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; }
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>
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/
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); }