向传递的回调添加参数

Adding parameter to passed callback

**对示例进行了更改以更正语法错误(全部为粗体),感谢 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) {
   ...
}

第一次,您应该向 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)