Javascript 如何获取indexedDb请求回调范围之外的结果

Javascript 如何获取indexedDb请求回调范围之外的结果,javascript,html,indexeddb,Javascript,Html,Indexeddb,我有一个带有输入框的表单,我想用IndexedDb objectStore中的值自动完成该表单,这适用于两个过度定位的输入框。我可以很好地处理一个简单数组,但我想让它处理objectStore中的值。 为此,我必须将可用的值从事务中取出,以便在自动完成函数中循环使用它们 1-如何将事务的结果放入代码其余部分中可用的对象中 2-我的循环语法“results.value.name.length”(名称是我的objectStore索引)是否可以处理结果对象 通过光标获取IndexedDb对象: var

我有一个带有输入框的表单,我想用IndexedDb objectStore中的值自动完成该表单,这适用于两个过度定位的输入框。我可以很好地处理一个简单数组,但我想让它处理objectStore中的值。 为此,我必须将可用的值从事务中取出,以便在自动完成函数中循环使用它们

1-如何将事务的结果放入代码其余部分中可用的对象中

2-我的循环语法“results.value.name.length”(名称是我的objectStore索引)是否可以处理结果对象

通过光标获取IndexedDb对象:

var results = [];

var openDbRequest = indexedDB.open(DB_NAME);

openDbRequest.onsuccess = function (e) {
    var db = e.target.result;
    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {
        var cursor = e.target.result;
        if (cursor) {
            results = cursor;
            cursor.continue();  
        };
    };                                      
};
自动完成函数

var auto = "";
var auto_disp = "";

function getName(results) {
    var input = document.forms['myform'].name.value;
    var len = input.length;
    if (input.length) {
        for (i=0; i<results.value.name.length; i++){            
            if (results.value.name[i].substr(0,len).toLowerCase() == input.toLowerCase()){
                auto_disp = input + results.value.name[i].substr(len);
                auto = results.value.name[i];
                break;
            }
        }
    }
document.forms['myform'].auto_name.value = auto_disp;
}

function setName() {
 document.forms['myform'].name.value = auto;
 hideAuto();
}

function hideAuto() {
 document.forms['myform'].auto_name.value = "";
}
var auto=”“;
var auto_disp=“”;
函数getName(结果){
var输入=document.forms['myform'].name.value;
var len=input.length;
if(输入长度){

对于(i=0;i如果要在事务范围之外使用它,只需将其添加到变量中即可

var results = [];
var openDbRequest = indexedDB.open(DB_NAME);
openDbRequest.onsuccess = function (e) {
    var db = e.target.result;
    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {
         var cursor = e.target.result;
         if (cursor) {
              results.push(cursor.value) 
              cursor.continue();
         };
    };
}; 

在此之后,您可以迭代results对象,一旦检索到所有数据,事务范围将关闭。

好的,我想是的。我如何测量对象的数量,“results.length”?我没有让循环工作。results.length应该提供集合中的元素数量,请记住,您只能开始一旦检索到indexeddb的数据,就迭代te集合。我想这是你的问题。是的……我得到了“TypeError:results is undefined”,任何关于如何超越它的想法,我都会调用getName()函数,这样事务就不应该在它里面,如果我将它嵌套在事务的oncomplete()中,它将被称为undefined。我试图禁用输入框,并执行如下操作:tran2.oncomplete=function(e){document.forms['myForm'].name.disabled=false;getName(results);};我想我回到了原点,光标或结果总是在事务或oncomplete()内部可用,但在外部不可用
openDbRequest.onsuccess = function (e) {
    var db = e.target.result;

    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {

        var cursor = e.target.result;
        if (cursor) { 
            var input = document.forms['myform'].country.value; //the inputted value
            var len = input.length;
            if (input.length) {
                for (i=0; i<cursor.length; i++){            
                    if (cursor.value.nome[i].substr(0,len).toLowerCase() == input.toLowerCase()){
                        auto_disp = input + cursor.value.nome[i].substr(len);
                        auto = cursor.value.nome[i];
                        break;                              
                    }
                }   
            }
            document.forms['myform'].auto_name.value = auto_disp;
            cursor.continue();  
        }   
    };
};
var results = [];
var openDbRequest = indexedDB.open(DB_NAME);
openDbRequest.onsuccess = function (e) {
    var db = e.target.result;
    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {
         var cursor = e.target.result;
         if (cursor) {
              results.push(cursor.value) 
              cursor.continue();
         };
    };
};