javascript,将参数传递给函数内部的闭包内的回调

时间:2016-05-08 18:22:16

标签: javascript parameters callback closures

我遇到了与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);

}

2 个答案:

答案 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");

一切都按预期工作。