如何同步使用localForage

时间:2019-02-07 08:35:05

标签: javascript callback local-storage localforage

我有一个Cordova移动应用程序,该应用程序将离线数据存储在localStorage中。最近,由于localStorage的限制为5MB,用户开始收到QUOTA_EXCEEDED_ERR错误。我决定使用“ localForage”框架,但我注意到它是异步工​​作的。由于我不想将所有复杂的应用程序包装都重写为回调函数,因此我想知道是否存在某种同步使用“ localForage”的方法(等待getItem函数返回值)。

这是我要执行的代码示例:

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

我希望getValue()返回一个值而不更改任何其他代码

4 个答案:

答案 0 :(得分:1)

根据此link

  

localForage具有双重API,可让您使用Node样式   回调或承诺。如果您不确定哪一个适合您,   建议使用Promises。

因此,您可以根据需要使用其中任何一个。如果使用诺言,则可以使用async/await等待结果

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

答案 1 :(得分:0)

我没有对此进行测试,也没有使用localForage的经验,但是我想您是否将结果设置为回调的返回值并返回,这就是您要寻找的

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

答案 2 :(得分:0)

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在这里:https://jsfiddle.net/mvdgxorL/

答案 3 :(得分:0)

query parameters,使用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);
}