Remove legacy iterator protocol use in Zotero.DB

This commit is contained in:
Sylvester Keil 2018-07-19 12:21:01 +02:00
parent 9737a4d974
commit dfe412d448
No known key found for this signature in database
GPG key ID: 878933BCEAB25A10
2 changed files with 12 additions and 16 deletions

View file

@ -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();
}
}
}

View file

@ -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++;