-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: scheduler unsubscription scenarios #6674
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
0dd8f02
chore: use sinon sandbox consistently
cartant 67e2c83
test: add failing flush tests
cartant fbaab9f
fix: don't execute actions scheduled within flush
cartant 54688d4
test: add failing tests
cartant fb9abf2
fix: avoid calling flush with empty actions queue
cartant 1f31101
chore: remove accidental auto-import
cartant b5d0d17
test: call all the dones
cartant File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,24 +4,32 @@ import { AsyncScheduler } from './AsyncScheduler'; | |
export class AsapScheduler extends AsyncScheduler { | ||
public flush(action?: AsyncAction<any>): void { | ||
this._active = true; | ||
// The async id that effects a call to flush is stored in _scheduled. | ||
// Before executing an action, it's necessary to check the action's async | ||
// id to determine whether it's supposed to be executed in the current | ||
// flush. | ||
// Previous implementations of this method used a count to determine this, | ||
// but that was unsound, as actions that are unsubscribed - i.e. cancelled - | ||
// are removed from the actions array and that can shift actions that are | ||
// scheduled to be executed in a subsequent flush into positions at which | ||
// they are executed within the current flush. | ||
const flushId = this._scheduled; | ||
this._scheduled = undefined; | ||
|
||
const { actions } = this; | ||
let error: any; | ||
let index = -1; | ||
action = action || actions.shift()!; | ||
const count = actions.length; | ||
|
||
do { | ||
if ((error = action.execute(action.state, action.delay))) { | ||
break; | ||
} | ||
} while (++index < count && (action = actions.shift())); | ||
} while ((action = actions[0]) && action.id === flushId && actions.shift()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It really feels like we should clean up this loop, but for now I think this change is solid. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No arguments from me re: clean up. |
||
|
||
this._active = false; | ||
|
||
if (error) { | ||
while (++index < count && (action = actions.shift())) { | ||
while ((action = actions[0]) && action.id === flushId && actions.shift()) { | ||
action.unsubscribe(); | ||
} | ||
throw error; | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sandbox
wasn't used consistently throughout this file, so I added a commit - 0dd8f02 - to address this.