2014-02-28 4 views
0

에이 코드를 마칩니다. 이 함수는 특정 값이 존재하는지 확인하기 위해 객체 저장소에서 반복 할 커서를 엽니 다.기다립니다 색인화

사실, 오류는 없지만 변수 값이 절대로 변경되지 않기 때문에 if (!isExisting) 안에있는 코드에 도달 할 수 없습니다.

function IsAlreadyExist(foo){ 
    var db = html5DB.indexedDB.db; 
    var objectStore = db.transaction("something").objectStore("something"); 

    objectStore.openCursor().onsuccess = function(event) { 
     var cursor = event.target.result; 

     if (cursor) { 
      if (cursor.value.text == foo) 
       return true; 

      cursor.continue(); 
     } 
    }; 

    return false; 
} 

실행의 종료를 기다리는 방법이있다 :

이것은 그 초 함수의 코드는? 또는 값이 존재하는지 확인하기 위해 진행하는 것이 좋은 방법이 아닌가?

답변

3

IndexedDB는 비동기 API이므로 콜백을 사용하여 작업이 완료 될 때까지 기다려야합니다. 그래서 여기

html5DB.indexedDB.addSomething = function(foo) { 
    IsAlreadyExist(foo, function (isExisting) { 
     if (!isExisting){ 
      var db = html5DB.indexedDB.db; 
      var trans = db.transaction(["something"], "readwrite"); 
      var store = trans.objectStore("something"); 

      var request = store.put({ 
       "text": foo, 
       "timeStamp" : new Date().getTime() 
      }); 
     } 
    }); 
}; 

우리가 할 수있는 기능을 전달하는 볼 수 있습니다 :

function IsAlreadyExist(foo, oncomplete) { 
    var db = html5DB.indexedDB.db; 
    var transaction = db.transaction("something"); 
    var objectStore = transaction.objectStore("something"); 

    var exists = false; 

    objectStore.openCursor().onsuccess = function(event) { 
     var cursor = event.target.result; 

     if (cursor) { 
      if (cursor.value.text == foo) { 
       exists = true; 
       return; 
      } 

      cursor.continue(); 
     } 
    }; 

    transaction.oncomplete = function() { 
     oncompleted(exists); 
    }; 
} 

이제 우리는 다른 방법을 리팩토링 것 :

첫째로 우리는 IsAlreadyExist 방법을 리팩토링 할 필요가 커서 검색이 상태의 인수를받는 콜백으로 수행되면 실행됩니다.

이렇게하면 좀 엉망이되기 시작할 수 있습니다. 따라서 Promise이 JavaScript에서 인기가 있습니다. db.js이라는 Promise 기반 API를 사용하는 IndexedDB에 대한 래퍼를 작성했습니다.

+0

완벽하게 작동했습니다. 감사합니다. 이 오류가 발생했습니다 :'Uncaught TransactionInactiveError : 트랜잭션이 완료되었습니다. ' 수정하기 위해'addSomething' 함수의 처음 3 행을'store.put' 바로 위에 놓았습니다. 그런 식으로 거래가 완료 될 시간이있었습니다. – Freelex

+0

하하하. 콜백 안에'put' 콜을위한 트랜잭션을 옮겨야합니다. –

+0

당신이 구세주라는 것을 반영하도록 코드를 수정했습니다. 나는 비동기를 기다리고 있지만 작동하지 않습니다. 이 기본 콜백은 작동 중입니다. 감사. 한 오타가 있습니다. 콜백 함수 이름은 oncomplete이어야합니다 ** d ** ..'function IsAlreadyExist (foo, oncompleted)' –