【问题标题】:Adding parameter to passed callback向传递的回调添加参数
【发布时间】:2016-08-01 20:36:04
【问题描述】:

**对示例进行了更改以纠正语法错误(全部为粗体),感谢 Luc DUZAN 的帮助。在最后一个代码示例中将 c.target.result 更改为用于保存数据 'objCollection' 的实际数组。

问题:我想为已经有参数的回调添加一个参数。

对于这个问题,我有调用函数 DataLayer.GetData 并在完成时执行回调的功能。我将带有两个现有参数的回调 LoadResults 传递到外壳内的函数 DataLayer.GetData 中。回调函数 LoadResults 正确地从 DataLayer.GetData 调用,并且最初在调用功能中分配的参数正确地传递到 LoadResults。

是否有通用方法或行业标准我可以解压缩回调添加 c.target.result 参数,然后调用 callbackOnComplete 回调,以便 c.target.result 最终成为 LoadResults 中的 dataResults 参数?

调用功能:

var dbCallback = function () { LoadResults('530', material.Id); };
DataLayer.GetData('530', 'TypeIndex', dbCallback);

数据层功能:

DataLayer.GetData = function (indexKey, indexName, callbackOnComplete) {
    var _this = this;
    var objCollection = new Array();

    try {
        var trans = _this.transaction(['objectStoreName'], "readonly");
        var store = trans.objectStore('objectStoreName');
        var index = store.index(indexName);
        var request = index.openCursor(indexKey);
        request.onerror = function (e) {
            ...
        }
        request.onsuccess = function (e) {
            var cursor = e.target.result;
            if (cursor) {
                objCollection.push(cursor.value);
                cursor.continue();
            }
        }
        trans.oncomplete = function (c) {
            if (callbackOnComplete) callbackOnComplete();
            else ...
        }
    }
    catch (e) {
        ...
        return false;
    }
}

回调函数:

LoadResults = function(formType, materialCode, dataResults) {
   ...
}

我希望能够在 DataLayer.GetData / trans.oncomplete 事件中完成的是将参数 objCollection 添加到 callbackOnComplete 回调参数列表中。比如:

callbackOnComplete.arguments.push(objCollection);

或者还有其他方法可以传入回调及其参数吗?

Luc DUZAN 确定的解决方案: 调用功能:

DataLayer.GetData.bind(null, '530', material.Id));

数据层功能:

DataLayer.GetData = function (indexKey, indexName, callbackOnComplete) {
    var _this = this;
    var objCollection = new Array();
    try {
        var trans = _this.transaction(['objectStoreName'], "readonly");
        var store = trans.objectStore('objectStoreName');
        var index = store.index(indexName);
        var request = index.openCursor(indexKey);
        request.onerror = function (e) {
            ...
        }
        request.onsuccess = function (e) {
            var cursor = e.target.result;
            if (cursor) {
                objCollection.push(cursor.value);
                cursor.continue();
            }
        }
        trans.oncomplete = function (c) {
            if (callbackOnComplete) callbackOnComplete.apply(null, [objCollection]);
            else ...
        }
    }
    catch (e) {
        ...
        return false;
    }
}

回调函数:

LoadResults = function(formType, materialCode, dataResults) {
   ...
}

【问题讨论】:

  • callbackOnComplete(<your paremeters>) 有什么问题?
  • 您要增加的不是callbackOnComplete 参数,而是您要更改的函数withinLoadResults() 的调用。虽然这是一个很好的问题,但它是糟糕设计的标志,虽然可能,但它不会很漂亮。

标签: javascript callback parameter-passing asynccallback


【解决方案1】:

第一次,您应该向 GetData 提供一个只需要来自 c.target.result 的参数的回调。

处理带有其他参数的回调不应该是您的 GetData 关心的问题。 你可以在 ES5 中使用 Function.prototype.bind 轻松做到这一点:

DataLayer.GetData('530', 'TypeIndex', LoadResults.bind(null, '530', material.id));

然后在 GetData 中,您只需要使用 c.target 中的值调用您的回调(如果我理解得很好,它是一个数组)。因为你可以使用Function.prototype.apply:

callbackOnComplete.apply(null, c.target);

例如,如果 c.target 为 [1,2,3],则此行将等效于:

callbackOnComplete(1,2,3)

【讨论】:

  • 谢谢卢克杜赞。您的解决方案运行良好,正是我所需要的,因此保持通用性。
猜你喜欢
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2015-12-27
  • 2015-06-05
  • 1970-01-01
  • 2021-01-27
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多