索引数据库:将单个记录检索为字符串

时间:2015-02-14 18:00:59

标签: indexeddb

我正在尝试创建一个查找单个记录的函数并将其作为字符串返回。在以下代码中,ALERT工作正常,显示正确的结果。但是,我无法弄清楚如何将结果传递给外部函数(读取),因此我可以调用它并获得字符串结果。根据我尝试的各种解决方案,它会一直“回”或“未定义”。我认为这很简单但尝试了很多不同的方法。非常感谢任何帮助。

我知道以下代码不起作用;这只是众多尝试之一!

    function read(itemnumber) {

    var ThisResult ="";
    var transaction = dbInterview.transaction(["ItemNameShort"]);
    var objectStore = transaction.objectStore("ItemNameShort");
    var request = objectStore.get(itemnumber);

    request.onerror = function(event) {
      alert("Unable to retrieve data");
    };
    request.onsuccess = function(event) {

      if(request.result) {
            alert("Name: " + request.result.ItemNameShort);
            ThisResult = JSON.stringify(request.result.ItemNameShort);
      } 
            else {
            alert("Not found"); 
             ThisResult = "";        
      }
       return ThisResult; 
    };

   return ThisResult;
   }

1 个答案:

答案 0 :(得分:0)

在使用indexedDB之前,您需要了解异步javascript。

这可能非常复杂,因此,作为获取某些内容的快捷方式,一种简单的方法是更改​​代码,以便将函数传递给函数,而不是返回值,然后将值传递给通过功能。例如:

function queryByItemNumber(itemnumber, itemHandlerFunction) {
  var openRequest = indexedDB.open(dbname, dbversion);
  openRequest.onupgradeneeded = myUpgradeNeededFunction;
  openRequest.onsuccess = function(event) {
    var db = event.target.result;
    var tx = db.transaction('ItemNameShort');
    var store = tx.objectStore('ItemNameShort');
    var getRequest = store.get(itemnumber);
    getRequest.onsuccess = function(event) {
      var item = event.target.result;

      // Instead of trying to return item, pass it to the 
      // item handler function
      itemHandlerFunction(item);
    };
  };
} 

// Now, to use the above function, do something like this:
queryByItemNumber(5, function item5HandlerFunction(item) {
  alert(item);
  document.getElementById('asdf').textContent = item.toString();
  console.log('got item %s', item);
  // etc
});

基本上,您在调用queryByItemNumber之后将代码移动到传递给queryByItemNumber的函数内部。这将异步工作。与项目一起使用的所有代码必须位于函数item5HandlerFunction(或者您想要调用它的任何内容中,或者保留它没有名称,如在匿名函数中)。如果代码在fn中,则保证仅在检索项目后运行。函数外的所有代码都不能保证在之后运行,即使你将它写在源代码文件后面的一行上。