mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 10:53:59 +00:00
fix(maps): stop all delivery once the controller is destroyed
A listener could destroy the controller and re-subscribe one still pending in the snapshot, which then ran. Delivery now stops at destruction and a destroyed controller takes no listeners. Adds ordering tests for adds, duplicates and re-adds during delivery, and moves the current-state note after the section intro.
This commit is contained in:
1 parent
69a84c47a1
commit
b9fa0eedcc
3 files changed
+41
-3
No files matched your search
@@ -53,3 +53,37 @@ test('destroying the controller during delivery stops remaining listeners', asyn
|
||||
await controller.setStack('fixture');
|
||||
assert.deepEqual(calls, ['destroy']);
|
||||
});
|
||||
|
||||
test('a listener re-added after destroy during delivery is not called', async () => {
|
||||
const controller = fixture();
|
||||
const calls = [];
|
||||
const later = () => calls.push('later');
|
||||
controller.subscribe(() => {
|
||||
calls.push('destroy');
|
||||
controller.destroy();
|
||||
controller.subscribe(later);
|
||||
});
|
||||
controller.subscribe(later);
|
||||
await controller.setStack('fixture');
|
||||
assert.deepEqual(calls, ['destroy']);
|
||||
});
|
||||
|
||||
test('delivery order: added during delivery waits, duplicates run once, re-added runs', async () => {
|
||||
const controller = fixture();
|
||||
const calls = [];
|
||||
const twice = () => calls.push('twice');
|
||||
const readded = () => calls.push('readded');
|
||||
let offReadded;
|
||||
controller.subscribe(() => {
|
||||
calls.push('first');
|
||||
controller.subscribe(() => calls.push('added-late'));
|
||||
offReadded();
|
||||
controller.subscribe(readded);
|
||||
});
|
||||
controller.subscribe(twice);
|
||||
controller.subscribe(twice);
|
||||
offReadded = controller.subscribe(readded);
|
||||
await controller.setStack('fixture');
|
||||
assert.deepEqual(calls, ['first', 'twice', 'readded']);
|
||||
controller.destroy();
|
||||
});
|
||||
Reference in new issue
Block a user