WebSocket:调用close()不会触发onclose处理程序?

时间:2018-02-05 09:46:41

标签: javascript websocket

我正在阅读Andrew Lombardi的书“WebSocket”, 它说那个

  

您可以通过exe手动触发调用onclose事件   在WebSocket对象上剪切close()方法,

第15页

但是当我调用close()方法时,它没有触发onclose事件......

Chrome上的

当呼叫(6-7 seconds maybe)时,服务器停止发送帧,几秒钟后onclose,我的close()处理程序被调用。

iOS 11上的

当调用import React, { Component } from 'react' class App extends Component { constructor(props) { super(props) this.state = { log: [], } this.ws = null } render() { return ( <div> <button type="button" onClick={this._open}> open </button> <button type="button" onClick={this._close}> close </button> <div style={{ padding: 10, backgroundColor: '#ddd' }} > {this.state.log.map((item, index) => { return <div key={index}>{item}</div> })} </div> </div> ) } _open = () => { this.ws = new WebSocket('wss://cmb.100jc.net/answer/ws') this.ws.onopen = () => { alert('open') this.setState(prevState => { return { log: prevState.log.concat('open') } }) } this.ws.onclose = () => { alert('close') this.setState(prevState => { return { log: prevState.log.concat('close') } }) } this.ws.onerror = () => { this.setState(prevState => { return { log: prevState.log.concat('error') } }) } } _close = () => { this.ws.close() } } export default App 时,服务器停止发送帧,但onclose处理程序从不调用。

那么,websocket close事件的真相是什么?

我在React中的演示应用代码

^XA
^MMT
^LS0
^BY96,95^FT52,107^BXN,6,200,0,0,1,~
^FH\^FD[mybarcode]^FS
^FT165,78^A0N,45,45^FH\^FD[mybarcode]^FS
^FT34,138^A0B,31,31^FH\^FD01-2018^FS
^FT48,145^A0N,31,31^FH\^FDMyCustomerLabel^FS
^RFW,H,1,18,1^FD400012345678901234567890123456789012^FS^RZ41265237,E,P^FS
^RZ41265237,A,P^FS
^WVY
^PQ1,0,1,Y^XZ

1 个答案:

答案 0 :(得分:0)

close()方法尝试对websocket执行正常关闭。在实际关闭套接字之前,它会等待closeTimeout秒(默认值为30秒),在此期间,其他对等方可以关闭帧。在此期间之后,套接字关闭,并发出事件。您可以在this great stack overflow answer中了解更多信息。