将参数添加到传递的回调中

时间:2016-04-11 15:21:31

标签: javascript callback parameter-passing asynccallback

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

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

对于这个问题,我有调用函数DataLayer.GetData的函数,并在完成时执行回调。我将这个带有两个现有参数的回调LoadResults传递给一个机箱内的DataLayer.GetData函数。正确地从DataLayer.GetData调用回调函数LoadResults,并且最初在调用功能中分配的参数被正确传递到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) {
   ...
}

1 个答案:

答案 0 :(得分:1)

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

GetData不应该关注处理带有其他参数的回调。 您可以使用Function.prototype.bind

在ES5中轻松完成此操作
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)