CouchDB _changes уведомления - использование jquery.couch.js couch.app.db.changes () - PullRequest
4 голосов
/ 25 ноября 2010

У меня есть репликация, работающая в CouchDB, и я хочу обновить свой интерфейс, когда изменения будут переданы в целевую базу данных. Я читал об API базы данных _changes и нашел функцию couch.app.db.changes () в jquery.couch.js. Однако я не могу понять, как использовать эту функцию. Я предполагаю, что мне нужно настроить слушателя, но мои знания Javascript еще не таковы, какими должны быть.

К сожалению, документы в http://www.couch.io/page/library-jquery-couch-js-database даже не содержат список изменений ().

Может ли кто-нибудь помочь мне здесь, а также сообщить мне, для чего предназначен параметр options.

Вот код для рассматриваемой функции:

    changes: function(since, options) {
      options = options || {};
      // set up the promise object within a closure for this handler
      var timeout = 100, db = this, active = true,
        listeners = [],
        promise = {
        onChange : function(fun) {
          listeners.push(fun);
        },
        stop : function() {
          active = false;
        }
      };
      // call each listener when there is a change
      function triggerListeners(resp) {
        $.each(listeners, function() {
          this(resp);
        });
      };
      // when there is a change, call any listeners, then check for another change
      options.success = function(resp) {
        timeout = 100;
        if (active) {
          since = resp.last_seq;
          triggerListeners(resp);
          getChangesSince();
        };
      };
      options.error = function() {
        if (active) {
          setTimeout(getChangesSince, timeout);
          timeout = timeout * 2;
        }
      };
      // actually make the changes request
      function getChangesSince() {
        var opts = $.extend({heartbeat : 10 * 1000}, options, {
          feed : "longpoll",
          since : since
        });
        ajax(
          {url: db.uri + "_changes"+encodeOptions(opts)},
          options,
          "Error connecting to "+db.uri+"/_changes."
        );
      }
      // start the first request
      if (since) {
        getChangesSince();
      } else {
        db.info({
          success : function(info) {
            since = info.update_seq;
            getChangesSince();
          }
        });
      }
      return promise;
    },

Ответы [ 4 ]

3 голосов
/ 28 ноября 2010

В качестве альтернативы вы можете использовать ленту изменений longpoll. Вот один пример:

    function bind_db_changes(database, callback) {
        $.getJSON("/" + database, function(db) {
            $.getJSON("/"+ database + 
                        "/_changes?since="+ db.update_seq +"&heartbeat=10000&feed=longpoll", 
            function(changes) {
                if($.isFunction(callback)){
                    callback.call(this, changes);
                    bind_db_changes(database, callback);
                }
            }); 
        });
    };

    bind_db_changes("test", function(changes){
        $('ul').append("<li>"+ changes.last_seq +"</li>");
    });
2 голосов
/ 04 мая 2012

Обратите внимание, что $ .couch.db.changes теперь находится в официальной документации:

http://daleharvey.github.com/jquery.couch.js-docs/symbols/%24.couch.db.changes.html

Также хороший пример использования _changes с плагином jquery.couch здесь:

http://bradley -holt.com / 2011/07 / CouchDB-JQuery-плагин ссылка

0 голосов
/ 04 декабря 2010

Я работал с кодом JS Promises, который позволил mt понять код CounchDB, который я выложил выше. Вот образец:

var promise_changes = app.db.changes();
// Add our deferred callback function. We can add as many of these as we want.
promise_changes.onChange( db_changes );

// called whenever this db changes.
function db_changes( resp ) {
    console.log( "db_changes: ", resp );
}

Google Chrome переходит в состояние занятости с длительными опросами, которые, я надеюсь, они разрешат однажды.

0 голосов
/ 26 ноября 2010

как насчет использования ajax-функций jquery?

function get_changes() {  
            $.getJSON("/path/to/_changes", function(changes) {  
                $.each(changes, function() {  
                    $("<li>").html(this.text).prependTo(mychanges_div);  
                });  
                get_changes();  
            });  
}  
setTimeout(get_changes, 1000);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...