У меня есть хорошее понимание JS, но в конечном итоге я все еще участвую. Я пытаюсь воссоздать проект PHP/mySQL для IndexedDB и не могу понять, почему я вижу ошибку здесь.Глобальная переменная доступна только для первой функции?
Соединение IndexedDB работает должным образом. Первая функция (createItem) отлично работает, однако вторая функция (getItems) возвращает ошибку, утверждая, что переменная «db» не определена. Это глобальная переменная, поэтому она должна быть доступна с помощью области действия, а функция createItem не имеет проблем с ее использованием. Может ли кто-нибудь помочь мне увидеть, что я пропустил здесь.
// GLOBAL DB VAR
var db;
// WAIT FOR DOM
document.addEventListener("DOMContentLoaded", function(){
// IF INDEXED DB CAPABLE
if("indexedDB" in window) {
// OPEN DB
var openRequest = indexedDB.open("newTabTest",1);
// CREATE NEW/UPDATE
openRequest.onupgradeneeded = function(e) {
// Notify user here: creating database (first time use)
var thisDB = e.target.result;
// Create "items" table if it doesn't already exist
if(!thisDB.objectStoreNames.contains("items")) {
var store = thisDB.createObjectStore("items", {keyPath: "id", autoIncrement: true});
store.createIndex("name","name", {unique:true});
store.createIndex("folder","folder", {unique:false});
store.createIndex("dial","dial", {unique:false});
}
}
openRequest.onsuccess = function(e) {
// Success- set db to target result.
db = e.target.result;
}
openRequest.onerror = function(e) {
// DB ERROR :-(
}
}
},false);
// CREATE ITEM FUNCTION
function createItem(n,u,f,c) {
var transaction = db.transaction(["items"],"readwrite");
var store = transaction.objectStore("items");
var item = {
name: n,
url: u,
folder: f,
colour: c,
dial: 0,
order: 100
}
var request = store.add(item);
request.onerror = function(e) {
console.log("An error occured.");
}
request.onsuccess = function(e) {
console.log("Successfully added.")
}
};
// GET ITEM(S) FUNCTION
// Specify index and key value OR omit for all
function getItems(callback, ind, key) {
var transaction = db.transaction(["items"],"readonly");
var store = transaction.objectStore("items");
var response = [];
// If args are omitted - grab all items
if(!ind | !key) {
var cursor = store.openCursor();
cursor.onsuccess = function(e) {
var res = e.target.result;
if(res) {
var r = {
"name": res.value['name'],
"url": res.value['url'],
"folder": res.value['folder'],
"colour": res.value['colour'],
"dial": res.value['dial'],
"order": res.value['order']
};
response.push(r);
res.continue();
}
}
cursor.oncomplete = function() {
callback(response);
}
} else {
// If both args are specified query specified index
store = store.index(ind);
var range = IDBKeyRange.bound(key, key);
store.openCursor(range).onsuccess = function(e) {
var res = e.target.result;
if(res) {
var r = {
"name": res.value['name'],
"url": res.value['url'],
"folder": res.value['folder'],
"colour": res.value['colour'],
"dial": res.value['dial'],
"order": res.value['order']
};
response.push(r);
res.continue();
}
}
cursor.oncomplete = function() {
callback(response);
}
}
};
Я думаю, что вы» ll найти вторую функцию * является * доступ к переменной, но ее * значение * является 'undefined'. Откуда вы вызываете эту функцию? Я предполагаю, что вы вызываете его до запуска асинхронного кода, который устанавливает 'db = ...'. – nnnnnn
Я пытался приклеить вызов getItems под сценарием выше, однако даже без вызова функции я получаю ошибку в консоли о том, что db не определено в этой строке. –
Ahhh. Вы можете что-то там! Мне действительно нужно окунуться в этот асинхронный бизнес. Как я мог надежно выполнить эту работу? Возможно, придерживаться моих зависимых от db действий внутри функции, которая сама вызывается индексомddd oncomplete? –