mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
Account for the case where a query might have been stopped before recompute
In minimongo, sometimes we precompute a list of queries that need recomputation, and then recompute them. When this happens, we call callbacks that sometimes end up stopping the query, which removes it from the list of queries on the collection. Without checking for this case, it casued an exception.
This commit is contained in:
@@ -643,9 +643,11 @@ _.extend(Meteor._LivedataConnection.prototype, {
|
|||||||
//
|
//
|
||||||
// Tests can set the 'expected' flag on an exception so it won't
|
// Tests can set the 'expected' flag on an exception so it won't
|
||||||
// go to log.
|
// go to log.
|
||||||
if (exception && !exception.expected)
|
if (exception && !exception.expected) {
|
||||||
|
debugger;
|
||||||
Meteor._debug("Exception while simulating the effect of invoking '" +
|
Meteor._debug("Exception while simulating the effect of invoking '" +
|
||||||
name + "'", exception, exception.stack);
|
name + "'", exception, exception.stack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point we're definitely doing an RPC, and we're going to
|
// At this point we're definitely doing an RPC, and we're going to
|
||||||
|
|||||||
@@ -419,14 +419,15 @@ LocalCollection.prototype.insert = function (doc) {
|
|||||||
var query = self.queries[qid];
|
var query = self.queries[qid];
|
||||||
if (query.selector_f(doc)) {
|
if (query.selector_f(doc)) {
|
||||||
if (query.cursor.skip || query.cursor.limit)
|
if (query.cursor.skip || query.cursor.limit)
|
||||||
queriesToRecompute.push(query);
|
queriesToRecompute.push(qid);
|
||||||
else
|
else
|
||||||
LocalCollection._insertInResults(query, doc);
|
LocalCollection._insertInResults(query, doc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_.each(queriesToRecompute, function (query) {
|
_.each(queriesToRecompute, function (qid) {
|
||||||
LocalCollection._recomputeResults(query);
|
if (self.queries[qid])
|
||||||
|
LocalCollection._recomputeResults(self.queries[qid]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -460,12 +461,12 @@ LocalCollection.prototype.remove = function (selector) {
|
|||||||
for (var i = 0; i < remove.length; i++) {
|
for (var i = 0; i < remove.length; i++) {
|
||||||
var removeId = remove[i];
|
var removeId = remove[i];
|
||||||
var removeDoc = self.docs[removeId];
|
var removeDoc = self.docs[removeId];
|
||||||
_.each(self.queries, function (query) {
|
_.each(self.queries, function (query, qid) {
|
||||||
if (query.selector_f(removeDoc)) {
|
if (query.selector_f(removeDoc)) {
|
||||||
if (query.cursor.skip || query.cursor.limit)
|
if (query.cursor.skip || query.cursor.limit)
|
||||||
queriesToRecompute.push(query);
|
queriesToRecompute.push(qid);
|
||||||
else
|
else
|
||||||
queryRemove.push([query, removeDoc]);
|
queryRemove.push({qid: qid, doc: removeDoc});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self._saveOriginal(removeId, removeDoc);
|
self._saveOriginal(removeId, removeDoc);
|
||||||
@@ -473,11 +474,15 @@ LocalCollection.prototype.remove = function (selector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// run live query callbacks _after_ we've removed the documents.
|
// run live query callbacks _after_ we've removed the documents.
|
||||||
for (var i = 0; i < queryRemove.length; i++) {
|
_.each(queryRemove, function (remove) {
|
||||||
LocalCollection._removeFromResults(queryRemove[i][0], queryRemove[i][1]);
|
var query = self.queries[remove.qid];
|
||||||
}
|
if (query)
|
||||||
_.each(queriesToRecompute, function (query) {
|
LocalCollection._removeFromResults(query, remove.doc);
|
||||||
LocalCollection._recomputeResults(query);
|
});
|
||||||
|
_.each(queriesToRecompute, function (qid) {
|
||||||
|
var query = self.queries[qid];
|
||||||
|
if (query)
|
||||||
|
LocalCollection._recomputeResults(query);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -516,8 +521,10 @@ LocalCollection.prototype.update = function (selector, mod, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_.each(recomputeQids, function (dummy, qid) {
|
_.each(recomputeQids, function (dummy, qid) {
|
||||||
LocalCollection._recomputeResults(self.queries[qid],
|
var query = self.queries[qid];
|
||||||
qidToOriginalResults[qid]);
|
if (query)
|
||||||
|
LocalCollection._recomputeResults(query,
|
||||||
|
qidToOriginalResults[qid]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user