向传递的回调添加参数
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)
**对示例进行了更改以更正语法错误(全部为粗体),感谢 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)