@@ -631,23 +631,30 @@ export class FastEvent<
631631 . map ( ( listener , i ) => [ listener , i , node . __listeners ] as [ FastListenerMeta , number , FastListenerMeta [ ] ] ) ) ;
632632 } , [ ] ) ;
633633
634- try {
635- const executeor = this . _getListenerExecutor ( args )
636- if ( executeor ) {
637- const r = executeor ( listeners . map ( listener => listener [ 0 ] ) , message , args , this . _executeListener . bind ( this ) ) as any [ ]
638- return Array . isArray ( r ) ? r : [ r ]
639- } else {
640- return listeners . map ( listener => this . _executeListener ( listener [ 0 ] [ 0 ] , message , args , true ) )
641- }
642- } finally {
643- // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除
644- for ( let i = listeners . length - 1 ; i >= 0 ; i -- ) {
645- const meta = listeners [ i ] [ 0 ] as FastListenerMeta
646- meta [ 2 ] ++ // 实际执行的次数
647- // =0不限执行次数,>0时代表执行次数限制
648- if ( meta [ 1 ] > 0 && meta [ 1 ] <= meta [ 2 ] ) {
649- listeners [ i ] [ 2 ] . splice ( i , 1 )
650- }
634+ // 执行监听器前计数选减一,否则如果在监听器函数中再次触发时会导致重复执行。
635+ // 比如:在once('x')监听函数中执行再次emit('x')就会导致循环
636+ this . _decListenerExecCount ( listeners )
637+
638+ const executeor = this . _getListenerExecutor ( args )
639+ if ( executeor ) {
640+ const r = executeor ( listeners . map ( listener => listener [ 0 ] ) , message , args , this . _executeListener . bind ( this ) ) as any [ ]
641+ return Array . isArray ( r ) ? r : [ r ]
642+ } else {
643+ return listeners . map ( listener => this . _executeListener ( listener [ 0 ] [ 0 ] , message , args , true ) )
644+ }
645+ }
646+ /**
647+ * 减少侦听器的执行次数
648+ * @param listeners
649+ */
650+ _decListenerExecCount ( listeners : [ FastListenerMeta , number , FastListenerMeta [ ] ] [ ] ) {
651+ // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除
652+ for ( let i = listeners . length - 1 ; i >= 0 ; i -- ) {
653+ const meta = listeners [ i ] [ 0 ] as FastListenerMeta
654+ meta [ 2 ] ++ // 实际执行的次数
655+ // =0不限执行次数,>0时代表执行次数限制
656+ if ( meta [ 1 ] > 0 && meta [ 1 ] <= meta [ 2 ] ) {
657+ listeners [ i ] [ 2 ] . splice ( i , 1 )
651658 }
652659 }
653660 }
0 commit comments