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

Lit*_*lee 5 javascript websocket

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

exe可以手动触发调用onclose事件吗?剪切 WebSocket 对象上的 close() 方法,

第 15 页

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

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

在 iOS 11 上: 当 call 时close(),服务器停止发送帧,但从未调用 onclose 处理程序。

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

我在 React 中的演示应用程序代码

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
Run Code Online (Sandbox Code Playgroud)

ome*_*mer 1

close() 方法尝试执行 websocket 的正常关闭。它closeTimeout在实际关闭套接字之前等待几秒钟(默认为 30 秒),在此期间其他对等方可以发送关闭帧。在此期间之后,套接字将关闭并发出事件。您可以在这个很棒的堆栈溢出答案中阅读更多相关内容。