【发布时间】:2016-09-03 08:25:41
【问题描述】:
我遇到了一个与 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);
}
【问题讨论】:
标签: javascript parameters callback closures