非同期IndexedDB APIのラッパー

今週の週末、非同期API IndexedDBを扱うことができました。



mozillaの例の解析フィールドは、コードができるほど良くないように思えました。



そして、非同期APIのラッパーを作成するために、IndexedDBでpsionicスキルを開発することにしました。



正直に言うと、私は記事を書くのが好きではありません。なぜなら、私はいつも言葉を読むのが面倒で、コードを読むのが好きだからです。



あなたもコードが好きなら、私はgithubに投稿しました



実際、この記事では、ラッパーの使用例に書かれている内容について説明します。



コードについては、多くの人が考えていると思いますので、私が今読んだ、または最近読んだ、ここに書いたコードを見てください...



はい、時々彼らはそのゴミをすべらせます。 私はこのコードに哲学的かつユーモアをもって関わっています。 親愛なる読者の皆さん、私はあなたを笑わせないことを心から願っています。



現在のAPIで気に入らなかったこと


html5 /ブラウザーの標準開発者が提供しているものには、いくつかの欠点があります。



ストレージの作成を例にとってみましょう。 個人的には、そのようなコードは扱いにくいようです。 コードが次のようになった場合、私はそれを好んだでしょう:

  1. var init = function ( event ) {
  2. if ( db。containsts ( 'customers' ) )
  3. 帰る
  4. db。 createStore ( 'customers' 、 { keyPath : 'ssn' } )
  5. 。 createIndex ( 'name' 、 {ユニーク: false } )
  6. 。 createIndex ( 'age' 、 {ユニーク: false } )
  7. 。 createIndex ( 'email' 、 {ユニーク: true } )
  8. 。 complete ( function ( event ) {
  9. コンソール。 info ( 「顧客の作成」 、イベント) ;
  10. } )
  11. 。 追加 ( customerData )
  12. 。 エラー ( errorHandler )
  13. 。 成功 ( 関数 (イベント) {
  14. コンソール。 info ( 「追加成功」 、イベント) ;
  15. } ) ;
  16. } ;


このコードは、例のコードよりもわずかに機能的です。たとえば、次のようなすべての操作でイベントが登録されます。



また、 クライアントによって以前にインストールされたアプリケーションではなく、Webで作業が実行されます。 そのため、ページを初めて読み込むことができます。データベースを操作するコンテキストにいくつかのイベントを追加したいと思います。たとえば:

  1. var db = new inDB ( { 名前 : 'testDatabase' 、バージョン: 42 } )
  2. 。 エラー ( errorHandler )
  3. //準備する前に
  4. 。 init ( init )
  5. 。 versionChange ( function ( event ) {
  6. コンソール。 log ( 'version changed、timeStamp:' 、 event。timeStamp 、 '、new version:' 、 this。version ) ;
  7. } )
  8. // 2012-02-22現在、WebKitはまだこれを実装していません。
  9. 。 upgradeNeeded ( function ( event ) {
  10. コンソール。 log ( 'onupgradeneeded、newVersion:' 、 event。newVersion 、 '、oldVersion: '、event。oldVersion 、 '、timeStamp:' 、 event。timeStamp 、 event ) ;
  11. 初期化。 呼び出し ( これ 、イベント) ;
  12. } )
  13. 。 ready ( function ( event ) {
  14. // ...
  15. } ) ;


つまり バージョンの変更について学習し、ストレージを初期化してデータを入力し、リポジトリの準備ができたら作業を開始します。 非同期、コンポートが追加されます。

私があなたを納得させていないなら、読書は無意味です。



私のやり方


私については、これらの考慮事項で十分でした。 モジラの例の後半で見たものは、それ以上好きではなかったからです。 つまり 例に感謝しますが、そのように生きたいとは思いません)。 このように見えたらもっと気に入ったでしょう。

  1. db。 openStore ( '顧客' )
  2. 。 get ( '444-44-4444' )
  3. 。 エラー ( errorHandler )
  4. 。 成功 ( 関数 (イベント) {
  5. コンソール。 log ( この .result ) ;
  6. } ) ;


そして、次のような別のインデックスの場合:

  1. db。 openStore ( '顧客' )
  2. 。 get ( 'name' 、 'Artur' )
  3. // ...


カーソルからデータを選択するには、実行コンテキストと、操作の開始、中間値、終了のブロックを分けたいです。次のようなものです。

  1. db。 openStore ( '顧客' )
  2. 。 get ( function ( query ) {
  3. クエリを返す
  4. 。 bound ( 'age' 、 30、60 、 true 、 true ) ; //すべて30歳> x && <60
  5. //設計による1つの述語indexeddb、getの後にwhereを使用してください
  6. } )
  7. 。 where ( function ( item ) {
  8. 返品 メール substr ( -8 ) 。 toLowerCase ( ) != 'home.org' ;
  9. } )
  10. 。 エラー ( errorHandler )
  11. 。 start ( function ( context ) {
  12. コンテキスト。 結果 = [ ] ;
  13. コンソール。 time ( 「IDBKeyRangeですべて取得」 ) ;
  14. } )
  15. 。 終了 ( function ( context ) {
  16. コンソール。 timeEnd ( 「 IDBKeyRangeで すべてを取得」 、コンテキスト、 結果 ) ;
  17. } )
  18. 。 success ( function ( event 、 context ) {
  19. var customer = this 。 結果 。 値 ;
  20. コンソール。 info ( 「IDBKeyRangeによって取得」 、 customer.ssn 、 customer 、 event 、 this ) ;
  21. if ( customer。ssn == '111-11-1111' ) {
  22. 顧客。 年齢 = 6 ;
  23. //カーソルのみ
  24. コンテキスト。 更新 (顧客) ;
  25. }
  26. コンテキスト。 結果 。 プッシュ (顧客) ;
  27. } ) ;


このようなアーキテクチャのデータベースへの非同期アクセスがindb.jsでどのように見えるかというビジョンを実装しました。



食べるものがまだあります。たとえば、ストレージオブジェクトの変更/作成に関するイベントを登録できます。データベースまたはストレージを削除する方がはるかに簡単です。



PS:FFでサンプルコードを実行する場合、IndexedDBエンジンの実装に奇妙なバグがあります。 customer.age = 6を変更した場合; ++ customer.age; その後、データベースを再作成すると、41歳ではなく60歳のマリアの年齢になります。また、5秒のタイムアウトでクリーンアップの前にスクリプトを再起動すると、すべてが正常になります。

UPD 1:FFで実行するには、ファイルシステムからではなく、任意のホストで実行する必要があります(localhostが実行します)。

UPD 2:サーバー側については、 http://tamejs.org/を参照できます。リンクについてはAndrey Kozlovに感謝します)



All Articles