3

読み込み画面を作成するために、pouchdb がレプリケートされるときの変更を追跡しようとしています。

それぞれに 2000 程度のドキュメントを含むいくつかのデータベースがあり、最初の読み込みにはかなりの時間がかかるため、アプリがバックグラウンドで何が起こっているかをユーザーに示す必要があります。

  //define vars
  var nameDB = "location";
  var remoteDB = new PouchDB("http://localhost:5984/" + nameDB);
  var localDB = new PouchDB(nameDB);
  var localdocCount;
  var localdocCounter = 0;
  var remotedocCount;

  //wrap replication in reusable function
  function replicate(){
    //replicate TO the server
    PouchDB.replicate(localDB,remoteDB, {
      continuous: false,
      attachments: true
    },
    function(){

        //on callback replicate FROM server
        PouchDB.replicate(remoteDB,localDB, {
          continuous: false,
          attachments: true
        },
        function(){
           //replicate FROM complete
        );
    });

    //compact local database to keep size down
    //all revisions are replicated to the server 
    //no need to keep them locally
    localDB.compact();
  }

  //get the remote db info first and see how many documents it has
  //remote update_seq how does it match up to localdb update_seq?
  remoteDB.info(function(err, info) {
    remotedocCount = info.doc_count;
    console.log(info);
  });

  //get info for local db for comparison with remote
  localDB.info(function(err, info) {

    localdocCount = info.doc_count;

    //Actually run the replication now that we have the 
    //remote and local db info
    replicate();

    //track any changes to the localdb
    localDB.changes({
      continuous: true,
      onChange: function(){

        //change detected increment counter
        localdocCounter++;

        console.log("Downloaded " 
          + (localdocCount + localdocCounter) 
          + " of " + remotedocCount + " to " + nameDB);

        //localdocCount === The total Documents in the local database
        //localdocCounter === The changes that have been made since
        //remotedocCount === The amount of documents we need


      }

    });
  });

上記のコードは、サーバーからクライアントにダウンロードされるドキュメントの量を追跡する試みです。

上記のコードは機能します。ドキュメントがダウンロードされていることがわかります。

ただし、これは最初の読み込みシナリオのみを処理します。ユーザーがドキュメントを更新するときはどうでしょうか?

ここで update_seq の出番だと思います。

しかし、 update_seq を使用して、必要な変更を正確に把握する方法がわかりません。

要約すると、変更が行われているかどうかはわかりますが、アプリケーションが最新の状態であると見なすために必要な変更の合計量を取得する方法はわかりません。

たぶん、このアプローチは完全にオフですか?

4

1 に答える 1

0

そこで注意点を一つ

   //on callback replicate FROM server
    PouchDB.replicate(remoteDB,localDB, {
      continuous: false,
      attachments: true
    },
    function(){
       //replicate FROM complete
    );

推奨されていません

   //on callback replicate FROM server
    PouchDB.replicate(remoteDB,localDB, {
      continuous: false,
      attachments: true,
      complete: function() {
       //replicate FROM complete
      }
    });

update_seqドキュメントの数のプロキシとして使用することはできません。これは、ドキュメントの書き込みと一致するか、または一致しない可能性がある複製元のマーカーですが、doc_count複製の両側を考えるとdocs_written、かなり正確なようですカウンター?

ああ、私はあなたのコードをもっと読んだだけです。変更を呼び出す必要はありません。レプリケートにはonChangeより多くの情報があります。それをより自動化することを検討したいかもしれません。それはかなり一般的な要求です

最初のロードを超えるリクエストについては、非常に遅いレプリケーションで大きなバッチを作成しない限り、非常に少量の単一の変更を期待する UI を持つように見えます。

于 2014-03-06T01:18:02.020 に答える