2013-06-26 2 views
0

데이터베이스에서 읽은 데이터를 변수에 넣으려고합니다. 나는 콜백 함수를 포함하여 많은 것을 tryed했지만 아무 것도 프로세스가 "opencursor(). onsuccess"함수 범위 밖에있을 때 작동하지 않습니다.변수에 IndexedDB 데이터베이스의 데이터 넣기

"경고 1"은 결과를 올바르게 표시하지만 "경고 2"및 "경고 3"은 올바르게 표시되지 않습니다.

HTML 코드에서 'main()'함수를 호출하고 있습니다.

나는 긍정적 인 결과없이 해결책을 찾기 위해 인터넷을 검색했기 때문에 정말 좌절했습니다.

아무도 도와 줄 수 있습니까?

고마워요.

var data=[]; 

function kkeyget(t1, db_name, db_version) 
{ 
    var request = indexedDB.open(db_name, db_version); 
    request.onerror=function() 
    { 
    alert("Error"); 
    }  
    request.onsuccess=function(event) 
    { 
    var db=this.result; 
    var trans = db.transaction(t1, "readonly"); 
    var objectStore = trans.objectStore(t1); 
    objectStore.openCursor().onsuccess = function(event) 
    { 
     var cursor = event.target.result; 
     if (cursor) 
     { 
     data.push(cursor.value); 

     //Alert 1: 
     alert(data[0].id); 

     cursor.continue(); 
     } 
     else alert("No more entries!"); 
    }; 
    } 

    //Alert 2: 
    alert(data[0].id); 
} 

function main() 
{ 
kkeyget("agenda", "example_db", 1); 

//Alert 3: 
alert(data[0].id); 
} 

답변

1

정확함. 모든 색인화 작업이 비동기이기 때문에, 코드가 실행됩니다 :
이 경고 2 // 정의되지 않은
경고 3 // 정의되지 않은
경고 1 // 올바른

동기 행동이 가까이하기 위해, 당신이 필요로하는 데이터를 수집 한 후에 새 함수를 호출하게합니다. 귀하의 alert("No more entries!")이있는 곳입니다.

+0

답장을 보내 주셔서 감사합니다. 이 문제는 W3에서 IndexedDB를 선택하려는 결정에서 비롯되었습니다. 그게 우리가 가진거야. :) –

0

키를 반환하는 대신 검색된 키를 인수로 사용하는 사용자 지정 콜백 함수를 전달하십시오.

// Your old function slightly modified 
function kkeyget(t1, db_name, db_version, callback, fallback) { 
// ... yada yada yada 
objectStore.openCursor().onsuccess = function(event) { 
    var cursor = event.target.result; 
    if(cursor) { 
    callback(cursor.value); 
    } else { 
    fallback(); 
    } 
} 
} 


// Now in your calling code: 
kkeyget('a','b',1, function(id) { 
    // Do something with the 'id' 
    // here in this anonymous function callback 
}, function() { 
    // Do something here to indicate no match 
}); 
+0

좋은 방법. 그것은 내 생필품을 위해 조금씩 강요되었지만 그것이 그것이 유일한 길임을 나는 알 수있다. 감사합니다. –