【发布时间】: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参数,而是您要更改的函数within 对LoadResults()的调用。虽然这是一个很好的问题,但它是糟糕设计的标志,虽然可能,但它不会很漂亮。
标签: javascript callback parameter-passing asynccallback