我正在尝试创建一个查找单个记录的函数并将其作为字符串返回。在以下代码中,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;
}
答案 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中,则保证仅在检索项目后运行。函数外的所有代码都不能保证在之后运行,即使你将它写在源代码文件后面的一行上。