fix: 超时优化
This commit is contained in:
		
							parent
							
								
									27db86cf2a
								
							
						
					
					
						commit
						9ea8e4e3e7
					
				| @ -20,6 +20,7 @@ const config = { | |||||||
| 
 | 
 | ||||||
| const singleTcpClient = (function () { | const singleTcpClient = (function () { | ||||||
|   let instance; |   let instance; | ||||||
|  | 
 | ||||||
|   function createInstance() { |   function createInstance() { | ||||||
|     return socket.constructTCPSocketInstance() |     return socket.constructTCPSocketInstance() | ||||||
|   } |   } | ||||||
| @ -35,55 +36,105 @@ const singleTcpClient = (function () { | |||||||
| })(); | })(); | ||||||
| 
 | 
 | ||||||
| export default async function tcp2ByteRequest(data): Promise<RES> { | export default async function tcp2ByteRequest(data): Promise<RES> { | ||||||
| 
 |  | ||||||
|   return new Promise(async (resolve, reject) => { |   return new Promise(async (resolve, reject) => { | ||||||
|     const tcpClient: socket.TCPSocket = singleTcpClient.getClient() |     const tcpClient: socket.TCPSocket = singleTcpClient.getClient(); | ||||||
|  |     const { address, port } = config; | ||||||
|  |     const tcp2Byte = new TcpToByte(); | ||||||
|  |     const sendData = tcp2Byte.getRequest(data); | ||||||
|  |     console.info(TAG, 'sendData=>' + JSON.stringify(sendData)); | ||||||
| 
 | 
 | ||||||
|     const {address,port} = config |     // 设置超时时间(例如 10 秒)
 | ||||||
|     const tcp2Byte = new TcpToByte() |     const timeoutDuration = 15000; // 10 秒
 | ||||||
|     const sendData = tcp2Byte.getRequest(data) |     let timeoutHandle: number | null = null; | ||||||
|     console.info(TAG, 'sendData=>' + JSON.stringify(sendData)) | 
 | ||||||
|  |     // 超时处理函数
 | ||||||
|  |     const timeoutPromise = new Promise<RES>((_, rejectTimeout) => { | ||||||
|  |       timeoutHandle = setTimeout(() => { | ||||||
|  |         const errMsg = 'TCP request timed out'; | ||||||
|  |         console.log(TAG, "超时", errMsg); | ||||||
|  |         promptAction.showToast({ | ||||||
|  |           message: errMsg, | ||||||
|  |           duration: 3000, | ||||||
|  |         }); | ||||||
|  |         tcpClient.close(); | ||||||
|  |         rejectTimeout(new Error(errMsg)); | ||||||
|  |       }, timeoutDuration); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|       await tcpClient.connect({ |       await tcpClient.connect({ | ||||||
|         address: { |         address: { | ||||||
|           address, port |           address, | ||||||
|         } |           port, | ||||||
|       }) |         }, | ||||||
|       //发送消息
 |       }); | ||||||
|       handSendMessage(tcpClient, data.sjbs, sendData) | 
 | ||||||
|  |       // 发送消息
 | ||||||
|  |       handSendMessage(tcpClient, data.sjbs, sendData); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       console.log(TAG, 'tcp client connect error' + JSON.stringify(e)) |       console.log(TAG, 'tcp client connect error' + JSON.stringify(e)); | ||||||
|       promptAction.showToast({ |       promptAction.showToast({ | ||||||
|         message: 'tcp client connect error' + JSON.stringify(e), |         message: 'tcp client connect error' + JSON.stringify(e), | ||||||
|         duration: 3000 |         duration: 3000, | ||||||
|       }); |       }); | ||||||
|       reject(e) |       reject(e); | ||||||
|  |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     //收到消息
 |     // 收到消息
 | ||||||
|     tcpClient.on('message', (data) => { |     tcpClient.on('message', (data) => { | ||||||
|       const res = handReceiveMessage(tcpClient, sendData, data.message) |       const res = handReceiveMessage(tcpClient, sendData, data.message); | ||||||
|       if (res) { |       if (res) { | ||||||
|         tcpClient.close() |         if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | ||||||
|         resolve(res) |         tcpClient.close(); | ||||||
|  |         resolve(res); | ||||||
|       } |       } | ||||||
|     }) |     }); | ||||||
| 
 | 
 | ||||||
|     tcpClient.on('error', (e) => { |     tcpClient.on('error', (e) => { | ||||||
|       const errMsg = 'tcp client receive error' + JSON.stringify(e) |       const errMsg = 'tcp client receive error' + JSON.stringify(e); | ||||||
|       promptAction.showToast({ |       promptAction.showToast({ | ||||||
|         message: 'tcp client receive error' + JSON.stringify(e), |         message: 'tcp client receive error' + JSON.stringify(e), | ||||||
|         duration: 3000 |         duration: 3000, | ||||||
|       }); |       }); | ||||||
|       console.log(TAG, errMsg) |       console.log(TAG, errMsg); | ||||||
|       tcpClient.close() |       if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | ||||||
|  |       tcpClient.close(); | ||||||
|       resolve({ |       resolve({ | ||||||
|         code: -1, message: errMsg |         code: 2300028, | ||||||
|       }) |         message: errMsg, | ||||||
|     }) |       }); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|   }) |     // 使用 Promise.race 处理超时和 TCP 请求
 | ||||||
|  |     Promise.race([timeoutPromise, new Promise<RES>((resolveMain) => { | ||||||
|  |       // 将 resolve 逻辑移到此处
 | ||||||
|  |       tcpClient.on('message', (data) => { | ||||||
|  |         const res = handReceiveMessage(tcpClient, sendData, data.message); | ||||||
|  |         if (res) { | ||||||
|  |           resolveMain(res); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       tcpClient.on('error', (e) => { | ||||||
|  |         const errMsg = 'tcp client receive error' + JSON.stringify(e); | ||||||
|  |         resolveMain({ | ||||||
|  |           code: 2300028, | ||||||
|  |           message: errMsg, | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  |     })]) | ||||||
|  |       .then((result) => { | ||||||
|  |         if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | ||||||
|  |         tcpClient.close(); | ||||||
|  |         resolve(result); | ||||||
|  |       }) | ||||||
|  |       .catch((error) => { | ||||||
|  |         if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | ||||||
|  |         tcpClient.close(); | ||||||
|  |         reject(error); | ||||||
|  |       }); | ||||||
|  |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //处理发送的数据
 | //处理发送的数据
 | ||||||
| @ -94,7 +145,8 @@ function handSendMessage(client: socket.TCPSocket, type, data) { | |||||||
|     case '02-21-000009': |     case '02-21-000009': | ||||||
|     case '02-21-000012': |     case '02-21-000012': | ||||||
|     case '02-21-000014': |     case '02-21-000014': | ||||||
|       data.forEach((item) => { |       data.forEach((item, index) => { | ||||||
|  |         console.log(TAG, "分包", index.toString(), JSON.stringify(item)) | ||||||
|         client.send({ data: new Uint8Array(item).buffer }) |         client.send({ data: new Uint8Array(item).buffer }) | ||||||
|       }) |       }) | ||||||
|       break; |       break; | ||||||
| @ -103,7 +155,6 @@ function handSendMessage(client: socket.TCPSocket, type, data) { | |||||||
|     case '02-21-000013': |     case '02-21-000013': | ||||||
|       client.send({ data: new Uint8Array(data).buffer }) |       client.send({ data: new Uint8Array(data).buffer }) | ||||||
|       break; |       break; | ||||||
| 
 |  | ||||||
|     default: |     default: | ||||||
|       break; |       break; | ||||||
|   } |   } | ||||||
| @ -133,6 +184,7 @@ function handReceiveMessage(client: socket.TCPSocket, sendData, rData: ArrayBuff | |||||||
|       const end = start + 1; |       const end = start + 1; | ||||||
|       const packageIndex = bytesToDecimal([packages[start], packages[end]]); |       const packageIndex = bytesToDecimal([packages[start], packages[end]]); | ||||||
|       console.info(TAG, '补包内容' + JSON.stringify(new Uint8Array(sendData[packageIndex -1]))) |       console.info(TAG, '补包内容' + JSON.stringify(new Uint8Array(sendData[packageIndex -1]))) | ||||||
|  |       printInBatches(new Uint8Array(sendData[packageIndex -1]), 100) | ||||||
|       client.send({ data: new Uint8Array(sendData[packageIndex -1]).buffer }); |       client.send({ data: new Uint8Array(sendData[packageIndex -1]).buffer }); | ||||||
|     }) |     }) | ||||||
|   } else { |   } else { | ||||||
| @ -149,4 +201,11 @@ function handReceiveMessage(client: socket.TCPSocket, sendData, rData: ArrayBuff | |||||||
|       message: messageContent |       message: messageContent | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function printInBatches(array, batchSize) { | ||||||
|  |   for (let i = 0; i < array.length; i += batchSize) { | ||||||
|  |     const batch = array.slice(i, i + batchSize); | ||||||
|  |     console.log(TAG, "补包细分", batch); | ||||||
|  |   } | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user