**構文エラー(すべて太字)を修正するために例を変更しました。Luc DUZANに感謝します。最後のすべてのコード例でデータ 'objCollection'を保持するために使用される実際の配列にc.target.resultを変更しました。渡されたコールバックにパラメータを追加する
問題:すでに引数を持つコールバックに引数を追加したいとします。
この問題では、関数DataLayer.GetDataを呼び出し、完了時にコールバックを実行する機能があります。私はこのコールバック、LoadResultsを2つの既存のパラメータと共にエンクロージャ内の関数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);
また、コールバックとそのパラメータを渡す別の手段がありますか? 呼び出す機能:
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;
}
}
コールバック機能:リュックDUZANで識別
ソリューション
LoadResults = function(formType, materialCode, dataResults) {
...
}
'callbackOnComplete()の何が問題なのですか? –
あなたが変更したい 'callbackOnComplete'パラメータではなく、変更したい関数内の' LoadResults() '*の呼び出しです。これは良い質問ですが、それは悪い設計の兆候であり、可能な限り、それほど美しくはありません。 – haim770