@@ -79,7 +79,7 @@ export class CustomEventMessage implements Message {
7979 data,
8080 } ;
8181 this . nativeSend ( body ) ;
82- // EventEmitter3 採用同步事件设计 ,callback会被马上执行而不像传统javascript架构以下一个macrotask 执行
82+ // EventEmitter3 采用同步事件设计 ,callback会被马上执行而不像传统javascript架构以下一个macrotask 执行
8383 resolve ( new WindowMessageConnect ( body . messageId , this . EE , new CustomEventPostMessage ( this ) ) ) ;
8484 } ) ;
8585 }
@@ -103,21 +103,18 @@ export class CustomEventMessage implements Message {
103103
104104 sendMessage < T = any > ( data : TMessage ) : Promise < T > {
105105 return new Promise ( ( resolve : ( ( value : T ) => void ) | null ) => {
106+ const messageId = uuidv4 ( ) ;
106107 const body : WindowMessageBody < TMessage > = {
107- messageId : uuidv4 ( ) ,
108+ messageId,
108109 type : "sendMessage" ,
109110 data,
110111 } ;
111- const eventId = `response:${ body . messageId } ` ;
112- let callback : EventEmitter . EventListener < string , any > | null = ( body : WindowMessageBody < TMessage > ) => {
113- if ( callback !== null ) {
114- this . EE . removeListener ( eventId , callback ) ;
115- resolve ! ( body . data as T ) ;
116- callback = null ; // 设为 null 提醒JS引擎可以GC
117- resolve = null ;
118- }
119- } ;
120- this . EE . addListener ( eventId , callback ) ;
112+ const eventId = `response:${ messageId } ` ;
113+ this . EE . addListener ( eventId , ( body : WindowMessageBody < TMessage > ) => {
114+ this . EE . removeAllListeners ( eventId ) ;
115+ resolve ! ( body . data as T ) ;
116+ resolve = null ; // 设为 null 提醒JS引擎可以GC
117+ } ) ;
121118 this . nativeSend ( body ) ;
122119 } ) ;
123120 }
@@ -126,23 +123,22 @@ export class CustomEventMessage implements Message {
126123 // 与content页的消息通讯实际是同步,此方法不需要经过background
127124 // 但是请注意中间不要有promise
128125 syncSendMessage ( data : TMessage ) : TMessage {
126+ const messageId = uuidv4 ( ) ;
129127 const body : WindowMessageBody < TMessage > = {
130- messageId : uuidv4 ( ) ,
128+ messageId,
131129 type : "sendMessage" ,
132130 data,
133131 } ;
134- let ret : TMessage ;
135- const eventId = `response:${ body . messageId } ` ;
136- let callback : EventEmitter . EventListener < string , any > | null = ( body : WindowMessageBody < TMessage > ) => {
137- if ( callback !== null ) {
138- this . EE . removeListener ( eventId , callback ) ;
139- ret = body . data ! ;
140- callback = null ; // 设为 null 提醒JS引擎可以GC
141- }
142- } ;
143- this . EE . addListener ( eventId , callback ) ;
144- this . nativeSend ( body ) ;
145- return ret ! ;
132+ let ret : TMessage | undefined | null ;
133+ const eventId = `response:${ messageId } ` ;
134+ this . EE . addListener ( eventId , ( body : WindowMessageBody < TMessage > ) => {
135+ ret = body . data ;
136+ } ) ;
137+ this . nativeSend ( body ) ; // 执行后立即返回 ret
138+ this . EE . removeAllListeners ( eventId ) ; // 即使没有立即执行也能清除callback
139+ // 如果 data 里含有不正确参数(非 primitive type),可能导致没有返回值
140+ if ( ! ret ) throw new Error ( "syncSendMessage response failed." ) ;
141+ return ret ;
146142 }
147143
148144 relateId = 0 ;
0 commit comments