diff options
author | John Christopher Anderson <jchris@apache.org> | 2010-06-23 22:26:21 +0000 |
---|---|---|
committer | John Christopher Anderson <jchris@apache.org> | 2010-06-23 22:26:21 +0000 |
commit | fc01c0af15cfb080349856353d00c4d8216b4849 (patch) | |
tree | 5577f731b3e8df959db5ad51af5b94ed6c1eb10a /share/www | |
parent | dfbc3a6efe778edf9e06f1fc4c36c602d065948e (diff) |
make jquery.couch.js changes handling more robust
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@957380 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'share/www')
-rw-r--r-- | share/www/script/jquery.couch.js | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/share/www/script/jquery.couch.js b/share/www/script/jquery.couch.js index 3dc5d1c5..ff248399 100644 --- a/share/www/script/jquery.couch.js +++ b/share/www/script/jquery.couch.js @@ -233,7 +233,9 @@ changes: function(since, options) { options = options || {}; // set up the promise object within a closure for this handler - var db = this, active = true, listeners = [], promise = { + var timeout = 100, db = this, active = true, + listeners = [], + promise = { onChange : function(fun) { listeners.push(fun); }, @@ -249,18 +251,24 @@ }; // when there is a change, call any listeners, then check for another change options.success = function(resp) { + timeout = 100; if (active) { - var seq = resp.last_seq; + since = resp.last_seq; triggerListeners(resp); - getChangesSince(seq); + getChangesSince(); }; }; + options.error = function() { + if (active) { + setTimeout(getChangesSince, timeout); + timeout = timeout * 2; + } + }; // actually make the changes request - function getChangesSince(seq) { - var opts = {}; - $.extend(opts, options, { + function getChangesSince() { + var opts = $.extend({heartbeat : 10 * 1000}, options, { feed : "longpoll", - since : seq + since : since }); ajax( {url: db.uri + "_changes"+encodeOptions(opts)}, @@ -270,11 +278,12 @@ } // start the first request if (since) { - getChangesSince(since); + getChangesSince(); } else { db.info({ success : function(info) { - getChangesSince(info.update_seq); + since = info.update_seq; + getChangesSince(); } }); } @@ -597,7 +606,16 @@ } }, complete: function(req) { - var resp = $.httpData(req, "json"); + try { + var resp = $.httpData(req, "json"); + } catch(e) { + if (options.error) { + options.error(req.status, req, e); + } else { + alert(errorMessage + ": " + e); + } + return; + } if (options.ajaxStart) { options.ajaxStart(resp); } @@ -605,7 +623,7 @@ if (options.beforeSuccess) options.beforeSuccess(req, resp); if (options.success) options.success(resp); } else if (options.error) { - options.error(req.status, resp.error, resp.reason); + options.error(req.status, resp && resp.error || errorMessage, resp && resp.reason || "no response"); } else { alert(errorMessage + ": " + resp.reason); } |