From dfe412d4488426a8d8d2bcacf8c37f20ae5d863e Mon Sep 17 00:00:00 2001 From: Sylvester Keil Date: Thu, 19 Jul 2018 12:21:01 +0200 Subject: [PATCH] Remove legacy iterator protocol use in Zotero.DB --- chrome/content/zotero/xpcom/db.js | 22 +++++++++------------- test/tests/dbTest.js | 6 +++--- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/chrome/content/zotero/xpcom/db.js b/chrome/content/zotero/xpcom/db.js index 3c0c22dc7f..dd819f17c2 100644 --- a/chrome/content/zotero/xpcom/db.js +++ b/chrome/content/zotero/xpcom/db.js @@ -584,22 +584,18 @@ Zotero.DBConnection.prototype.queryAsync = Zotero.Promise.coroutine(function* (s } var failed = false; if (options && options.onRow) { - // Errors in onRow don't stop the query unless StopIteration is thrown - onRow = function (row) { + // Wrap onRow to cancel iteration by default and reject the promise + // on any error, which Sqlite.jsm does not do. + onRow = function (row, cancel) { try { - options.onRow(row); + options.onRow(row, () => { + Zotero.debug("Query cancelled", 3); + cancel(); + }); } catch (e) { - // If the onRow throws a StopIteration, stop gracefully - if (e instanceof StopIteration) { - Zotero.debug("Query cancelled", 3); - } - // Otherwise, mark the promise as rejected, which Sqlite.jsm doesn't do - // on a StopIteration by default - else { - failed = e; - } - throw StopIteration; + failed = e; + cancel(); } } } diff --git a/test/tests/dbTest.js b/test/tests/dbTest.js index a83c89afb0..1da155ce29 100644 --- a/test/tests/dbTest.js +++ b/test/tests/dbTest.js @@ -151,16 +151,16 @@ describe("Zotero.DB", function() { assert.equal(e.message, "Failed"); }); - it("should stop gracefully if onRow throws a StopIteration", function* () { + it("should stop gracefully if onRow is cancelled", function* () { var i = 0; var rows = []; yield Zotero.DB.queryAsync( "SELECT * FROM " + tmpTable, false, { - onRow: function (row) { + onRow: function (row, cancel) { if (i > 0) { - throw StopIteration; + return cancel(); } rows.push(row.getResultByIndex(0)); i++;