gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:12:57 24 4
gpt4 key购买 nike

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

关于javascript - 将参数添加到传递的回调中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36552815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com