2

IndexedDB APIを調べていると、イベントをトリガーする必要があるように見えるメソッド呼び出しの後に設定されているイベントハンドラーの例がいくつか見つかりました。

var db = null;
try {
  var dbOpenRequest = window.indexedDB.open("BookShop1");
  dbOpenRequest.onsuccess = function(event){
    db = dbOpenRequest.result;
    DAO.version = db.version;
    ...

私はJavaScriptでかなりの開発を行ってきましたが、これは私には奇妙に見えると言って恥ずかしい思いをします。実際のopen()呼び出しの前にイベントハンドラーを設定する必要があるように感じますが、いくつかの例でこのパターンを見てきました。誰かが私がこれを理解するのを手伝ってもらえますか?

4

3 に答える 3

2

JavaScriptのシングルスレッドと非同期の性質の原因。openを呼び出すと、関数はすぐに実行されます。ただし、成功したコールバックはシングルスレッドの関数スタックに配置されます。これらの関数は、実際の関数が終了する前に呼び出すことはできません。したがって、関数でリクエストオブジェクトを変更すると、成功が呼び出されたときにコールバックが存在します。これは、実行コンテキストスタックを理解するのに役立つ記事です。

于 2012-02-05T21:47:47.877 に答える
1

It appears that opening the database is just an open. It's not an actual DB request and the onsuccess handler is for an actual database request that comes later.

It is good practice to install event handlers before they could possibly be called, but in this case, the dbOpenRequest object doesn't exist until after the open call (it's returned as the result of the open call) so there is no way to put an onsuccess handler on it until after the open. Thus, the onsuccess handler has to be called some time later as a response to some event other than the open (probably a DB query) or never called at all.

于 2012-02-05T21:47:17.090 に答える
0

これはおそらく、オープンが非同期であり、多少の遅延があるためです(オープンはすぐには実行されません)。その間、JavaScriptは実行(およびイベントのバインド)を続行します。

于 2012-02-05T21:31:17.407 に答える