@@ -1009,10 +1009,8 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
1009
1009
* @returns {AsyncIterator }
1010
1010
*/
1011
1011
function on ( emitter , event , options ) {
1012
- const queue = new FixedQueue ( ) ;
1012
+ let queue = new FixedQueue ( ) ;
1013
1013
let resume = null ;
1014
- let error = null ;
1015
- let errored = false
1016
1014
1017
1015
const signal = options ?. signal ;
1018
1016
validateAbortSignal ( signal , 'options.signal' ) ;
@@ -1033,48 +1031,42 @@ function on(emitter, event, options) {
1033
1031
{ once : true } ) ;
1034
1032
}
1035
1033
1036
- function errorHandler ( err ) {
1037
- error = err ;
1038
- errored = true ;
1039
-
1034
+ function push ( val ) {
1040
1035
if ( resume ) {
1041
- resume ( Promise . reject ( err ) ) ;
1036
+ resume ( val ) ;
1042
1037
resume = null ;
1038
+ } else {
1039
+ queue . push ( val ) ;
1043
1040
}
1044
1041
}
1045
1042
1046
- function abortListener ( ) {
1047
- errorHandler ( new AbortError ( undefined , { cause : signal ?. reason } ) ) ;
1043
+ function errorHandler ( err ) {
1044
+ if ( queue ) {
1045
+ push ( Promise . reject ( err ) ) ;
1046
+ }
1048
1047
}
1049
1048
1050
1049
function eventHandler ( ...args ) {
1051
- if ( resume ) {
1052
- resume ( args ) ;
1053
- resume = null ;
1054
- } else {
1055
- queue . push ( args ) ;
1056
- }
1050
+ push ( args ) ;
1051
+ }
1052
+
1053
+ function abortListener ( ) {
1054
+ errorHandler ( new AbortError ( undefined , { cause : signal ?. reason } ) ) ;
1057
1055
}
1058
1056
1059
1057
return async function * ( ) {
1060
1058
try {
1061
1059
while ( true ) {
1062
1060
while ( ! queue . isEmpty ( ) ) {
1063
- if ( errored ) {
1064
- throw error ;
1065
- }
1066
- yield queue . shift ( ) ;
1067
- }
1068
-
1069
- if ( errored ) {
1070
- throw error ;
1061
+ yield await queue . shift ( ) ;
1071
1062
}
1072
1063
1073
1064
yield await new Promise ( resolve => {
1074
1065
resume = resolve ;
1075
1066
} ) ;
1076
1067
}
1077
1068
} finally {
1069
+ queue = null ;
1078
1070
eventTargetAgnosticRemoveListener ( emitter , event , eventHandler ) ;
1079
1071
eventTargetAgnosticRemoveListener ( emitter , 'error' , errorHandler ) ;
1080
1072
}
0 commit comments