Revert "Remove legacy iterator protocol use in Zotero.DB"

Reverting this until we can use Fx60 for testing.

This reverts commit dfe412d448.
This commit is contained in:
Sylvester Keil 2018-07-30 10:18:11 +02:00
parent 2dce5f4842
commit 143fdd5f2b
No known key found for this signature in database
GPG key ID: 878933BCEAB25A10
2 changed files with 16 additions and 12 deletions

View file

@ -584,18 +584,22 @@ Zotero.DBConnection.prototype.queryAsync = Zotero.Promise.coroutine(function* (s
}
var failed = false;
if (options && options.onRow) {
// Wrap onRow to cancel iteration by default and reject the promise
// on any error, which Sqlite.jsm does not do.
onRow = function (row, cancel) {
// Errors in onRow don't stop the query unless StopIteration is thrown
onRow = function (row) {
try {
options.onRow(row, () => {
Zotero.debug("Query cancelled", 3);
cancel();
});
options.onRow(row);
}
catch (e) {
failed = e;
cancel();
// 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;
}
}
}

View file

@ -151,16 +151,16 @@ describe("Zotero.DB", function() {
assert.equal(e.message, "Failed");
});
it("should stop gracefully if onRow is cancelled", function* () {
it("should stop gracefully if onRow throws a StopIteration", function* () {
var i = 0;
var rows = [];
yield Zotero.DB.queryAsync(
"SELECT * FROM " + tmpTable,
false,
{
onRow: function (row, cancel) {
onRow: function (row) {
if (i > 0) {
return cancel();
throw StopIteration;
}
rows.push(row.getResultByIndex(0));
i++;