【问题标题】:javascript, passing parameters to a callback inside a closure that is inside a functionjavascript,将参数传递给函数内部的闭包内的回调
【发布时间】: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


    【解决方案1】:

    一段时间后,我回到了这个问题并找到了一个可行的解决方案。 问题是我在一次调用中初始化了 objectStore。

    var objectStore = db.transaction("employee").objectStore("employee");
    

    如果我把这个电话分成两个不同的部分:

    var transaction = db.transaction("employee");
    var objectStore = transaction.objectStore("employee");
    

    一切都按预期工作。

    【讨论】:

      【解决方案2】:

      你可以像这样调用函数

      callBackFunction(resultData);
      

      以便您传递的函数接收结果。在函数声明中你应该有这样一个参数:

      function callbackFunction(results) { 
         //create the table
      }
      

      你可以把它传递给readAll() 喜欢

      readAll(callbackFunction);
      

      编辑:

      根据您的编辑。 您必须在函数声明中添加额外的参数

      function readAll(callBackFunction, table_id, data) {
         // ... code
        callBackFunction(table_id, data, resultData);
      }
      

      然后您可以在 createTable 函数中声明另外 2 个参数,它们将收到“table_id”和“data”。

      【讨论】:

      • 谢谢,但我的问题是我需要传递更多参数,例如“table_id”、“header”等,所以我需要将一些参数传递给 readAll 并将这些参数传递给回调,一些比如:readAll(callBackFunction, "table_id", "header_array")
      • 我也做了这个测试,但是闭包内的参数数组是空的
      • @Marco,我的错,忘了你在不同的函数中调用你的函数,所以参数对象是不同的。您必须选择第二个解决方案,并将额外参数添加到 readAll。 (如上所述)
      • 但问题是:objectStore.openCursor().onsuccess = function(event) { console.log(arguments); } 返回未定义!只有在函数之外,参数才是正确的
      • @Marco,阅读我的帖子。您必须添加readAll(callBackFunction, table_id, data) {,然后在该函数中调用callBackFunction(table_id, data, resultData);。如果你想存储参数,你可以创建一个数组并用 arguments 的值填充它。但是,我会在我编辑的代码中创建如上所述的函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多