我遇到了与db.transaction()。objectStore.onsuccess相关的问题 我需要取回数据来创建一个包含结果的表。
作为第一次测试,我尝试在完全读取光标后从调用中返回数据:
function readAll() {
var resultData=[];
var objectStore = db.transaction("employee").objectStore("employee");
objectStore.openCursor().onsuccess = function(event, args) {
var cursor = event.target.result;
if (cursor){
resultData.push(cursor.value);
cursor.continue();
}else{
return resultData;
}
};
}
但这不起作用,因为indexedDB的异步性质
所以,经过一番思考后我尝试使用回调......
function readAll(callBackFunction) {
var resultData=[];
var objectStore = db.transaction("employee").objectStore("employee");
objectStore.openCursor().onsuccess = function(event, args) {
var cursor = event.target.result;
if (cursor){
resultData.push(cursor.value);
cursor.continue();
}else{
callBackFunction;
}
};
}
这似乎部分有效,因为将调用回调,但我无法将参数传递给回调函数,因为参数数组在onsuccess = function()中是空的(因为我可以理解参数绑定到readAll函数)而且我无法将其传递到onsuccess中。 那么如何将参数传递给回调?
还有另一种选择与回调不同吗?
谢谢
更新
我的问题是我需要传递除结果之外的更多参数,例如“table_id”,“header”等。所以我需要将一些参数传递给readAll并将这些参数传递给回调,例如: readAll(callBackFunction,“table_id”,“header_array”)
我已经在下面的测试中测试了不起作用:
function readAll(callBackFunction) {
var resultData=[];
var objectStore = db.transaction("employee").objectStore("employee");
objectStore.openCursor().onsuccess = function(event, args) {
var cursor = event.target.result;
if (cursor){
resultData.push(cursor.value);
cursor.continue();
}else{
callBackFunction(parameters[1], parameters[2], resultData);
}
};
}
readAll(createTable, 'table_id', ['username', 'email']);
问题是在闭包
中参数数组是空的更新2
arguments数组在闭包内是空的,但在外面是可以的。如果我在闭包之外移动回调,我有参数而不是数据..
更新3
同时将所有参数添加到函数中似乎无效。
function readAll(callback, header, idName, classToAdd, resultData) {
var resultData=[];
var objectStore = db.transaction("employee").objectStore("employee");
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor){
resultData.push(cursor.value);
//alert("Name for id " + cursor.key + " is " + cursor.value.name + ", Age: " + cursor.value.age + ", Email: " + cursor.value.email);
cursor.continue();
}else{
//HERE ALL ARGUMENTS ARE EMPTY BUT resultData Exists!
callback(arguments[1], arguments[2], arguments[3], arguments[4], resultData);
}
};
//HERE ALL ARGUMENTS EXISTS EXCEPT resultData!
callback(arguments[1], arguments[2], arguments[3], arguments[4], resultData);
}
答案 0 :(得分:1)
你可以调用像
这样的函数callBackFunction(resultData);
以便您传递的功能收到结果。在函数声明中,您应该有这样一个参数:
function callbackFunction(results) {
//create the table
}
您可以将其传递给readAll()
readAll(callbackFunction);
修改强>
根据你的编辑。 您必须在函数声明中添加额外的参数
function readAll(callBackFunction, table_id, data) {
// ... code
callBackFunction(table_id, data, resultData);
}
然后你可以在你的createTable函数中声明另外两个参数,他们将收到" table_id"和"数据"。
答案 1 :(得分:0)
一段时间后,我回到这个问题,找到一个有效的解决方案。 问题是我在一次调用中初始化了objectStore。
filterable: {
cell: {
operator: "contains",
template: function (args) {
args.element.css("width", "90%").addClass("k-textbox").keydown(function(e){
setTimeout(function(){
$(e.target).trigger("change");
});
});
}
}
}
如果我把这个电话分成两个不同的部分:
var objectStore = db.transaction("employee").objectStore("employee");
一切都按预期工作。