@@ -49,21 +49,52 @@ export function listenAlways<NAME extends keyof EventMap>(eventName: NAME, callb
4949/**
5050 * Registers a event listener that will be called on every event of the given name.
5151 *
52- * The listener will be automatically removed when the component is destroyed.
53- *
54- * Should only be used inside a Svelte component.
55- *
5652 * @param eventName
5753 * @param callback
54+ * @return A function that can be called to remove the listener.
5855 */
59- export function listen < NAME extends keyof EventMap > ( eventName : NAME , callback : ( event : EventMap [ NAME ] ) => void ) {
56+ function listenNonComponent < NAME extends keyof EventMap > ( eventName : NAME , callback : ( event : EventMap [ NAME ] ) => void ) {
6057 if ( ! listeners . has ( eventName ) ) {
6158 listeners . set ( eventName , [ ] ) ;
6259 }
6360
6461 listeners . get ( eventName ) ! ! . push ( callback ) ;
6562
66- onDestroy ( ( ) => deleteListener ( eventName , callback ) ) ;
63+ return ( ) => deleteListener ( eventName , callback ) ;
64+ }
65+
66+ /**
67+ * Registers a event listener that will be called on every event of the given name.
68+ *
69+ * The listener will be automatically removed when the component is destroyed.
70+ *
71+ * Should only be used inside a Svelte component.
72+ *
73+ * @param eventName
74+ * @param callback
75+ */
76+ export function listen < NAME extends keyof EventMap > ( eventName : NAME , callback : ( event : EventMap [ NAME ] ) => void ) {
77+ const onDestroyHook = listenNonComponent ( eventName , callback ) ;
78+ onDestroy ( onDestroyHook ) ;
79+ }
80+
81+ /**
82+ * Wait next event which matches given {@link predicate}.
83+ */
84+ export async function waitMatches < NAME extends keyof EventMap > ( eventName : NAME , predicate : ( event : EventMap [ NAME ] ) => boolean ) : Promise < EventMap [ NAME ] > {
85+ return new Promise ( ( resolve , reject ) => {
86+ const deleteHandler = listenNonComponent ( eventName , ( e ) => {
87+ try {
88+ if ( predicate ( e ) ) {
89+ resolve ( e ) ;
90+ deleteHandler ( ) ;
91+ }
92+ } catch ( e ) {
93+ reject ( e ) ;
94+ deleteHandler ( ) ;
95+ }
96+ } )
97+ } ) ;
6798}
6899
69100export function cleanupListeners ( ) {
0 commit comments