2014-10-01 4 views
2

У меня есть некоторые данные в таблице IndexedDB, что довольно просто содержит эти данные:Как получить данные таблицы IndexedDB в переменную?

var Customers = [ 
    { ssn: "123-45-6666", name: "Andrew", age: 22, email: "[email protected]" }, 
    { ssn: "555-66-7777", name: "Gail", age: 25, email: "[email protected]" } 
]; 

Я тогда эту функцию, чтобы получить данные обратно из индексированной:

function RetrieveTableRows(Table) { 
    var returnData = []; 

    var db = window.indexedDB.db; 
    var trans = db.transaction([Table], "readwrite"); 
    var store = trans.objectStore(Table); 

    var keyRange = IDBKeyRange.lowerBound(0); 
    var cursorRequest = store.openCursor(keyRange); 

    cursorRequest.onerror = window.indexedDB.onerror; 

    cursorRequest.onsuccess = function(e) { 
     var result = e.target.result; 
     if(!!result == false) { 
     return; 
     } 
     returnData.push(result.value); 

     result.continue(); 
    };  

    return returnData; 

} 

Я понимаю, что это не потому что функция onsuccess асинхронна, но я не могу решить проблему.

Просто я хочу, чтобы иметь возможность написать:

var myCustomers = RetrieveTableRows('customers'); 

и быть в состоянии затем использовать переменную myCustomers - возможно ли это?

Я попытался с помощью JQuery.deferred(); метод, но это, похоже, не работает, и я знаю, что я мог бы сделать что-то вроде этого:

transaction.oncomplete = function() { 
     ReturnTableRows(returnData); 
    };     
} 
function ReturnTableRows(data) { 
    //do something with the array of data 
} 

, но я не могу работать, как передать это обратно к переменной myCustomers.

ответ

4

Используя отложенный объект, который должен быть в состоянии сделать что-то вроде этого

function RetrieveTableRows(Table) { 
    var returnData = []; 
    //setup deferred object 
    var defer = $.Deferred(); 
    var db = window.indexedDB.db; 
    var trans = db.transaction([Table], "readwrite"); 
    var store = trans.objectStore(Table); 

    var keyRange = IDBKeyRange.lowerBound(0); 
    var cursorRequest = store.openCursor(keyRange); 

    cursorRequest.onerror = window.indexedDB.onerror; 

    cursorRequest.onsuccess = function(e) { 
     var result = e.target.result; 
     if(!!result == false) { 
     //when done resolve the promise, you could also do more 
     //checking and reject the data so you can handle 
     //errors 
     defer.resolve(returnData); 

     //Make sure we exit the function once we run out of data! 
     return 
     } 
     returnData.push(result.value); 

     result.continue(); 
    };  

    //return the promise 
    return defer.promise(); 

} 

//########### then to use this ########### 

//this is now a promise 
var myCustomersPromise = RetrieveTableRows('customers'); 
var myCustomers; 

//action todo when promise is resolved/rejected 
$.when(myCustomersPromise).done(function(data){ 
    //do something with the data/assign it to you var here 
    myCustomers= data; 
}).fail(function(data){ 

}); 

хотя я на самом деле не используется IndexedDB раньше, поэтому, возможно, недопонимание, как запрос знает он закончил (я asssuming result.continue() назвал onSuccess снова, и результат неверен, когда он прошел через все данные), но это настройка, которую я использую при выполнении асинхронно в моих приложениях.

+0

я сделал именно это в моем предыдущем тестировании отложенного метода, но я получаю ошибки. Хотя, пересмотрев это, я обнаружил, почему я получаю эту ошибку - например, вы удалили поле «return» в операторе 'if (!! result == false)'. –

+0

Я добавил возврат в код, чтобы я мог принять ваш ответ - спасибо! :) –

+0

хорошие уловки – Quince

0

Альтернативный метод, который я нашел, который использует меньше кода, намного проще и не требует JQuery.

Установка:

// Create the function(s) to grab and store the data 
var myCustomers; 

var getData = { 
    customers: function(data) { 
     myCustomers = data 
    } 
} 

Вызов:

//Send the callback function we want into the retrieve function 
trans.oncomplete = function (e) { 
    RetrieveTableRows('Customers', getData.customers)  
}; 

Функция:

function RetrieveTableRows(Table, Callback) { 
    var returnData = []; 

    var db = window.indexedDB.db; 
    var trans = db.transaction([Table], "readwrite"); 
    var store = trans.objectStore(Table); 

    var keyRange = IDBKeyRange.lowerBound(0); 
    var cursorRequest = store.openCursor(keyRange); 

    cursorRequest.onerror = window.indexedDB.onerror; 

    cursorRequest.onsuccess = function(e) { 
     var result = e.target.result; 
     if(!!result == false) { 
     // Send the information back to our specified function 
     Callback(returnData); 
     return 
     } 
     returnData.push(result.value); 

     result.continue(); 
    };  

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