js封裝一個(gè)websocket

創(chuàng)建websocket.js

let Socket = ''
let setIntervalWesocketPush = null

/**
 * 建立websocket連接
 * @param {string} url ws地址
 */
export const createSocket = url => {
  Socket && Socket.close()
  if (!Socket) {
    console.log('建立websocket連接')
    Socket = new WebSocket(url)
    Socket.onopen = onopenWS
    Socket.onmessage = onmessageWS
    Socket.onerror = onerrorWS
    Socket.onclose = oncloseWS
  } else {
    console.log('websocket已連接')
  }
}

/**打開WS之后發(fā)送心跳 */
const onopenWS = () => {
  sendPing()
}

/**連接失敗重連 */
const onerrorWS = () => {
  Socket.close()
  clearInterval(setIntervalWesocketPush)
  console.log('連接失敗重連中')
  if (Socket.readyState !== 3) {
    Socket = null
    createSocket()
  }
}

/**WS數(shù)據(jù)接收統(tǒng)一處理 */
const onmessageWS = e => {
  window.dispatchEvent(new CustomEvent('onmessageWS', {
    detail: {
      data: e.data
    }
  }))
}

/**
 * 發(fā)送數(shù)據(jù)但連接未建立時(shí)進(jìn)行處理等待重發(fā)
 * @param {any} message 需要發(fā)送的數(shù)據(jù)
 */
const connecting = message => {
  setTimeout(() => {
    if (Socket.readyState === 0) {
      connecting(message)
    } else {
      Socket.send(JSON.stringify(message))
    }
  }, 1000)
}

/**
 * 發(fā)送數(shù)據(jù)
 * @param {any} message 需要發(fā)送的數(shù)據(jù)
 */
export const sendWSPush = message => {
  if (Socket !== null && Socket.readyState === 3) {
    Socket.close()
    createSocket()
  } else if (Socket.readyState === 1) {
    Socket.send(JSON.stringify(message))
  } else if (Socket.readyState === 0) {
    connecting(message)
  }
}

/**斷開重連 */
const oncloseWS = () => {
  clearInterval(setIntervalWesocketPush)
  console.log('websocket已斷開....正在嘗試重連')
  if (Socket.readyState !== 2) {
    Socket = null
    createSocket()
  }
}
/**發(fā)送心跳
 * @param {number} time 心跳間隔毫秒 默認(rèn)5000
 * @param {string} ping 心跳名稱 默認(rèn)字符串ping
 */
export const sendPing = (time = 5000, ping = 'ping') => {
  clearInterval(setIntervalWesocketPush)
  Socket.send(ping)
  setIntervalWesocketPush = setInterval(() => {
    Socket.send(ping)
  }, time)
}


下載 (也可復(fù)制源碼丁稀,放在本地丘逸,使用方式相同)

npm install @sven0706/websocket -S

使用


// 在main.js或需要使用的地方引入并建立連接
import { createSocket } from '@sven0706/websocket'
createSocket('wss://api.baidu.com')


// 發(fā)送消息
import { sendWSPush } from '@sven0706/websocket'
sendWSPush(data)

// 接收消息
const getsocketData = e => {  // 創(chuàng)建接收消息函數(shù)
  const data = e && e.detail.data
  console.log(data)
}
// 注冊監(jiān)聽事件
window.addEventListener('onmessageWS', getsocketData)

// 在需要的時(shí)候卸載監(jiān)聽事件,比如離開頁面
window.removeEventListener('onmessageWS', getsocketData)

API

僅三個(gè)api, 且一般只需要用到`createSocket`, `sendWSPush`

/**
 * 建立websocket連接
 * @param {string} url ws地址
 */
createSocket(url)

/**
 * 發(fā)送數(shù)據(jù)
 * @param {any} message 需要發(fā)送的數(shù)據(jù)
 */
 sendWSPush(message)

/**發(fā)送心跳
 * @param {number} time 心跳間隔毫秒 默認(rèn)5000
 * @param {string} ping 心跳名稱 默認(rèn)字符串ping
 */
 sendPing()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衡未,一起剝皮案震驚了整個(gè)濱河市庞呕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疗疟,老刑警劉巖该默,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異策彤,居然都是意外死亡栓袖,警方通過查閱死者的電腦和手機(jī)匣摘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裹刮,“玉大人音榜,你說我怎么就攤上這事”刂福” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵恕洲,是天一觀的道長塔橡。 經(jīng)常有香客問我,道長霜第,這世上最難降的妖魔是什么葛家? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泌类,結(jié)果婚禮上癞谒,老公的妹妹穿的比我還像新娘。我一直安慰自己刃榨,他們只是感情好弹砚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枢希,像睡著了一般桌吃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苞轿,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天茅诱,我揣著相機(jī)與錄音,去河邊找鬼搬卒。 笑死瑟俭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的契邀。 我是一名探鬼主播摆寄,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坯门!你這毒婦竟也來了椭迎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤田盈,失蹤者是張志新(化名)和其女友劉穎畜号,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體允瞧,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡简软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蛮拔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痹升。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡建炫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疼蛾,到底是詐尸還是另有隱情肛跌,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布察郁,位于F島的核電站衍慎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏皮钠。R本人自食惡果不足惜稳捆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麦轰。 院中可真熱鬧乔夯,春花似錦、人聲如沸款侵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽新锈。三九已至鞠评,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壕鹉,已是汗流浹背剃幌。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晾浴,地道東北人负乡。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像脊凰,于是被迫代替她去往敵國和親抖棘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 實(shí)現(xiàn)代碼如下: 首先定義一個(gè)結(jié)構(gòu)體 wsConn websocket的長鏈接的實(shí)體inChan 讀數(shù)據(jù)的chann...
    小小Desperado閱讀 1,636評(píng)論 0 0
  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢敢當(dāng)閱讀 8,885評(píng)論 0 50
  • WebSocket簡介 談到Web實(shí)時(shí)推送狸涌,就不得不說WebSocket切省。在WebSocket出現(xiàn)之前,很多網(wǎng)站為...
    吧啦啦小湯圓閱讀 8,126評(píng)論 15 75
  • 最近筆者新參與的一個(gè)web項(xiàng)目帕胆,擬定采用vue2.0來編寫朝捆,期間遇到有關(guān)使用websocket的問題,記錄一下懒豹,個(gè)...
    七寶琥珀閱讀 43,939評(píng)論 6 35
  • 我從來沒想過要和你分手,以前是儒老,現(xiàn)在是蝴乔,將來也是。 今年來考古所實(shí)習(xí)驮樊,是個(gè)意外薇正。來了這里遇到你,也是個(gè)意外囚衔。和你相...
    傲嬌張蜀黍閱讀 573評(píng)論 4 7