2014-09-30 2 views
0
  req = db.openCursor(); 
      req.customerData=new Array() //[{a:1}] 
      req.onsuccess = function(e) { 
       var cursor = e.currentTarget.result; 
       if (cursor) { 
        //console.log(cursor.value); 
        e.currentTarget.customerData.push(cursor.value); 
        e.currentTarget.customerData.push("hello?");   
        cursor.continue() 
       } 
       else { 
        console.log(e.currentTarget.customerData) //this always correct 
       } 
      } 

    console.log(req.customerData); //outside the onsuccess everything is gone? 

console.log(req);IndexedDB openCursor транзакция OnSuccess возвращает пустой массив

Я могу видеть customerData когда я открыть объект в хромированной консоли

console.log(req.customerData);

Но когда я делаю над ним пусто?

замена new Array() с [{a:1}]

console.log(req.customerData);

Я могу видеть a, а также другие объекты

, но затем agian

console.log(req.customerData[0].a);

работы и другие объекты исчезли.

Как сохранить данные клиента? Я попробовал просто нажимать цифры или текст, но то же самое после транзакции. Я не могу получить данные только отображать его на console.log() во время транзакции?

Я знаю, что это должно быть что-то мимо по ссылке, но каждая переменная, которую я забираю, исчезает?

Добавлен полный пример ниже только тип записи() и читать() в консоли

<script> 
     var iDB 
     ready=function(){ 
      var request = indexedDB.open("my-database",1); 
      request.onupgradeneeded = function(e) { 
       var db = e.currentTarget.result 
       var store = db.createObjectStore("store", {keyPath: "muts", autoIncrement:false}) 
       //store.createIndex("by_submit", "submit", {unique: false}) 
       console.log('db upgrade', 'v'+db.version) 
      } 
      request.onerror = function(e) { 
       //var db = e.currentTarget.result; 
       //db.close() 
       console.error('db error ',e) 
      } 
      request.onsuccess = function(e) { 
       var db = e.currentTarget.result 
       db.onversionchange = function(e) { 
        db.close() 
        console.log('db changed', 'v'+db.version, 'CLOSED') 
       } 
       console.log('db setup', 'v'+db.version, 'OK') 
      } 
      iDB=request 
     } 

     drop=function(){ 
      iDB.result.close() 
      var req = indexedDB.deleteDatabase(this.iDB.result.name); 
      req.onsuccess = function() {console.log("Deleted database successfully")} 
      req.onerror = function() {console.log("Couldn't delete database")} 
      req.onblocked = function() {console.log("Couldn't delete database due to the operation being blocked")} 
     } 

     read=function(){ 
      var db=iDB 
        .result 
        .transaction(["store"], "readwrite").objectStore("store"); 

      var req = db.openCursor(); 
      req.iData=new Array(); 
      req.onsuccess = function(e) { 
       var cursor = e.currentTarget.result; 
       if (cursor) { 
        e.currentTarget.iData.push(cursor.value); 
        e.currentTarget.iData.push("hello"); 
        cursor.continue() 
       } 
       else { 
        console.log(e.currentTarget.iData) 
       } 
      } 

      console.log(req.iData) 

     } 

     write=function(){ 
      var db=document.querySelector('my\-database') 
       .iDB 
       .result 
       .transaction(["store"], "readwrite").objectStore("store"); 

      var customerData = [ 
       {muts: "Bill", qty: "1"}, 
       {muts: "Donna", qty: "1"} 
      ] 

      for (var i in customerData){db.put(customerData[i])} 
     } 

     ready() 
    </script> 
+0

Глупый вопрос, но почему вы пишете данные обратно в объект запроса? Почему бы не использовать собственный массив? Я склонен рассматривать объекты запроса как это только для чтения (даже если это не так). –

+0

Я был отчаянным ха-ха :) Пробовал все, чтобы попасть в отдельный массив. Я просто хочу переменную, которая имеет данные в ней после того, как курсор сделан. –

ответ

2

Несколько вещей

  • Я не рекомендую настройки пользовательских свойств объекта IDBRequest. Создайте и получите доступ к объектам, находящимся во внешней области.
  • Нет необходимости использовать event.currentTarget. event.target достаточно (и это тоже «это», и сам объект запроса).
  • onversionchange устарел.
  • Из-за асинхронного характера индексированного DB вы можете попробовать что-то напечатать на консоли, которая еще не существует или больше не существует. Вместо этого попробуйте распечатать что-то, когда транзакция завершится.

Например:

function populateArray(openDatabaseHandle, onCompleteCallbackFunction) { 
    var transaction = openDatabaseHandle.transaction('store'); 
    var store = transaction.objectStore('store'); 
    var myArray = []; 
    var request = store.openCursor(); 
    request.onsuccess = function() { 
    var cursor = this.result; 
    if(!cursor) return; 
    myArray.push(cursor.value); 
    cursor.continue(); 
    }; 
    transaction.oncomplete = function() { 
    onCompleteCallbackFunction(myArray); 
    }; 
} 

// An example of calling the above function 
var conn = indexedDB.open(...); 
conn.onsuccess = function() { 
    populateArray(this.result, onPopulated); 
}; 

// An example of a callback function that can be passed to 
// the populateArray function above 
function onPopulated(data) { 
    console.debug(data); 
    data.forEach(function(obj) { 
    console.debug('Object: %o', obj); 
    }); 
} 
+0

Я вернусь к этому, сначала нужно сделать несколько тестов, чтобы сравнить разницу. –

+0

Хорошо, что ключевая часть действительно состоит в том, что область, в которой я могу использовать данные, находится в 'oncomplete', таком же принципе, как' onload' для ajax –

Смежные вопросы