2016-04-11 12 views
0

**構文エラー(すべて太字)を修正するために例を変更しました。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) { 
    ... 
} 
+1

'callbackOnComplete()の何が問題なのですか? –

+0

あなたが変更したい 'callbackOnComplete'パラメータではなく、変更したい関数内の' LoadResults() '*の呼び出しです。これは良い質問ですが、それは悪い設計の兆候であり、可能な限り、それほど美しくはありません。 – haim770

答えて

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。ターゲットが[1,2,3]の場合、この行は次のようになります。

callbackOnComplete(1,2,3) 
+0

ありがとうLuc DUZAN。あなたのソリューションは完璧に動作し、私が必要としていたものであり、それによって汎用性を保っていました。 – indianapolymath

関連する問題