Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MuGuiLin
uni-app
提交
f8ff71d8
U
uni-app
项目概览
MuGuiLin
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f8ff71d8
编写于
7月 12, 2021
作者:
D
DCloud_LXH
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(App): 修复 socket 回调触发不正确问题
上级
41506284
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
74 addition
and
28 deletion
+74
-28
packages/uni-app-plus/src/service/api/network/socket.ts
packages/uni-app-plus/src/service/api/network/socket.ts
+74
-28
未找到文件。
packages/uni-app-plus/src/service/api/network/socket.ts
浏览文件 @
f8ff71d8
...
...
@@ -31,14 +31,29 @@ type Socket = {
}
})
=>
void
close
:
({
code
,
reason
}:
{
code
?:
number
;
reason
?:
string
})
=>
void
onopen
:
Function
onmessage
:
Function
onerror
:
Function
onclose
:
Function
WebSocket
:
Function
onopen
:
(
cb
:
(
args
:
{
id
:
string
})
=>
void
)
=>
void
onmessage
:
(
cb
:
(
args
:
{
id
:
string
;
message
:
string
|
Object
})
=>
void
)
=>
void
onerror
:
(
cb
:
(
args
:
{
id
:
string
;
message
:
string
})
=>
void
)
=>
void
onclose
:
(
cb
:
(
args
:
{
id
:
string
code
:
number
reason
:
string
wasClean
:
boolean
})
=>
void
)
=>
void
WebSocket
:
(
args
:
{
id
:
string
url
:
string
protocol
?:
string
header
?:
any
})
=>
void
}
type
eventName
=
keyof
WebSocketEventMap
const
socketTasks
:
SocketTask
[]
=
[]
const
socketsMap
:
Record
<
string
,
SocketTask
>
=
{}
const
globalEvent
:
Record
<
eventName
,
string
>
=
{
open
:
''
,
close
:
''
,
...
...
@@ -47,12 +62,13 @@ const globalEvent: Record<eventName, string> = {
}
let
socket
:
Socket
export
function
createSocketTask
(
args
:
UniApp
.
ConnectSocketOption
)
{
function
createSocketTask
(
args
:
UniApp
.
ConnectSocketOption
)
{
const
socketId
=
String
(
Date
.
now
())
let
errMsg
try
{
if
(
!
socket
)
{
socket
=
requireNativePlugin
(
'
uni-webSocket
'
)
bindSocketCallBack
(
socket
)
}
socket
.
WebSocket
({
id
:
socketId
,
...
...
@@ -68,6 +84,29 @@ export function createSocketTask(args: UniApp.ConnectSocketOption) {
return
{
socket
,
socketId
,
errMsg
}
}
function
bindSocketCallBack
(
socket
:
Socket
)
{
socket
.
onopen
((
e
)
=>
{
const
curSocket
=
socketsMap
[
e
.
id
]
if
(
!
curSocket
)
return
curSocket
.
_socketOnOpen
()
})
socket
.
onmessage
((
e
)
=>
{
const
curSocket
=
socketsMap
[
e
.
id
]
if
(
!
curSocket
)
return
curSocket
.
_socketOnMessage
(
e
)
})
socket
.
onerror
((
e
)
=>
{
const
curSocket
=
socketsMap
[
e
.
id
]
if
(
!
curSocket
)
return
curSocket
.
_socketOnError
()
})
socket
.
onclose
((
e
)
=>
{
const
curSocket
=
socketsMap
[
e
.
id
]
if
(
!
curSocket
)
return
curSocket
.
_socketOnClose
()
})
}
class
SocketTask
implements
UniApp
.
SocketTask
{
private
_callbacks
:
{
open
:
Function
[]
...
...
@@ -98,31 +137,35 @@ class SocketTask implements UniApp.SocketTask {
this
.
readyState
=
this
.
CLOSED
if
(
!
this
.
_socket
)
return
}
this
.
_socket
.
onopen
(()
=>
{
this
.
readyState
=
this
.
OPEN
this
.
socketStateChange
(
'
open
'
)
})
this
.
_socket
.
onmessage
((
e
:
any
)
=>
{
this
.
socketStateChange
(
'
message
'
,
{
data
:
typeof
e
.
data
===
'
object
'
?
base64ToArrayBuffer
(
e
.
data
.
base64
)
:
e
.
data
,
})
})
this
.
_socket
.
onerror
(()
=>
{
this
.
socketStateChange
(
'
error
'
)
this
.
onErrorOrClose
()
})
this
.
_socket
.
onclose
(()
=>
{
this
.
socketStateChange
(
'
close
'
)
this
.
onErrorOrClose
()
_socketOnOpen
()
{
this
.
readyState
=
this
.
OPEN
this
.
socketStateChange
(
'
open
'
)
}
_socketOnMessage
(
e
:
any
)
{
this
.
socketStateChange
(
'
message
'
,
{
data
:
typeof
e
.
data
===
'
object
'
?
base64ToArrayBuffer
(
e
.
data
.
base64
)
:
e
.
data
,
})
}
_socketOnError
()
{
this
.
socketStateChange
(
'
error
'
)
this
.
onErrorOrClose
()
}
_socketOnClose
()
{
this
.
socketStateChange
(
'
close
'
)
this
.
onErrorOrClose
()
}
onErrorOrClose
()
{
this
.
readyState
=
this
.
CLOSED
delete
socketsMap
[
this
.
id
]
const
index
=
socketTasks
.
indexOf
(
this
)
if
(
index
>=
0
)
{
socketTasks
.
splice
(
index
,
1
)
...
...
@@ -130,14 +173,16 @@ class SocketTask implements UniApp.SocketTask {
}
socketStateChange
(
name
:
eventName
,
res
:
Data
=
{})
{
const
data
=
name
===
'
message
'
?
res
:
{}
if
(
this
===
socketTasks
[
0
]
&&
globalEvent
[
name
])
{
UniServiceJSBridge
.
invokeOnCallback
(
globalEvent
[
name
],
res
)
UniServiceJSBridge
.
invokeOnCallback
(
globalEvent
[
name
],
data
)
}
// WYQ fix: App平台修复websocket onOpen时发送数据报错的Bug
this
.
_callbacks
[
name
].
forEach
((
callback
)
=>
{
if
(
typeof
callback
===
'
function
'
)
{
callback
(
name
===
'
message
'
?
res
:
{}
)
callback
(
data
)
}
})
}
...
...
@@ -211,6 +256,7 @@ export const connectSocket = defineTaskApi<API_TYPE_CONNECT_SOCKET>(
},
0
)
}
else
{
socketTasks
.
push
(
socketTask
)
socketsMap
[
socketId
]
=
socketTask
}
setTimeout
(()
=>
{
resolve
()
...
...
@@ -237,7 +283,7 @@ export const sendSocketMessage = defineAsyncApi<API_TYPE_SEND_SOCKET_MESSAGE>(
export
const
closeSocket
=
defineAsyncApi
<
API_TYPE_CLOSE_SOCKET
>
(
API_CLOSE_SOCKET
,
(
args
:
AsyncApiOptions
<
API_TYPE_CLOSE_SOCKET
>
,
{
resolve
,
reject
})
=>
{
(
args
,
{
resolve
,
reject
})
=>
{
const
socketTask
=
socketTasks
[
0
]
if
(
!
socketTask
)
{
reject
(
'
WebSocket is not connected
'
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录