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