2017-01-12 1 views
0

openCursorのonsuccessイベントに2つの関数をバインドできますか? 私は最初の行にある初期値を設定するためにこれを行いたいと思います。openCursorの2つの成功

;(function() { 
 
\t var variables = {} 
 
\t 
 
\t var myTransaction = myDatabase.transaction(['myData']) 
 
\t var myObjectStore = myTransaction.objectStore('myData') 
 
\t var myIndex = myObjectStore.index('myIndex') 
 
\t var myRange = IDBKeyRange.only(0) 
 
\t var myRequest = myIndex.openCursor(myRange) 
 
\t myRequest.onsuccess = firstRow // This is what I'm wondering about 
 
\t myRequest.onsuccess = mySuccess // Can I have two onsuccess events? 
 
\t 
 
\t function firstRow(response) { 
 
\t \t var result = response.target.result 
 
\t \t if (result) { 
 
\t \t \t variables.custid = result.value.custid 
 
\t \t \t // Notice there's no result.continue() here 
 
\t \t } 
 
\t } 
 
\t function mySuccess(response) { 
 
\t \t var result = response.target.result 
 
\t \t if (result) { 
 
\t \t \t if (result.value.custid === variables.custid) { 
 
\t \t \t \t // yay 
 
\t \t \t } 
 
\t \t \t result.continue() 
 
\t \t } 
 
\t } 
 
}())

答えて

1

はい。 onsuccessは、一般に、イベントリスナーを追加するための文法砂糖です。主な違いは、onsuccessを設定すると、他のすべてのイベントリスナーが上書きされますが、適切な構文を使用してイベントリスナーを追加することはできません。あなたのコードは動作しません。なぜなら、onsuccessを2回目に設定すると最初のリスナを上書きするだけなのでです。

次のことを試してみてください。

function foo() { 
    var request = store.openCursor(); 
    request.addEventListener('success', firstListenerFunction); 
    request.addEventListener('success', secondListenerFunction); 
} 

リスナーが最初に通知されるかに関する保証はありません。ほとんどの実装では、登録順にリスナーに通知するため、最初はリスナーになります。しかし、これは保証されていません。

また、両方のリスナーに毎回通知されます。パフォーマンスの影響に注意してください。

IDBRequestのようなさまざまなindexedDB APIオブジェクトは、基本的にEventTargetクラスから継承します。 Hereは、EventTargetについて学ぶための参考になります。 EventTargetはすべての場所で使用されます。