浏览器端 js 的 socket 都藏哪去了

2018-04-15 09:32:49 +08:00
 lolizeppelin

fetch 不提供 timeout,只能设定时器让函数退出但控制不了实际 socket

尝试了下搜索找 js 设置 socket timeout 居然是其他模块的

fecth 底层的 sokcet 是咋弄的?

虽然见过用过的语言不多...但还真没见过 js 这样不暴露 socket 的.....想 http 请求设置 timeout 就这么难?

8425 次点击
所在节点    JavaScript
40 条回复
rookiebulls
2018-04-15 09:36:29 +08:00
axios 了解一下
Lxxyx
2018-04-15 09:37:22 +08:00
XHR 有 timeout,fetch 是 promise,目前浏览器还不支持 abort 方法。你可以看 axios 的 cancel Token 实现,我用那个实现过 fetch 的 timeout
duan602728596
2018-04-15 09:42:58 +08:00
想用 socket,请使用 html5 的 WebSocket
lolizeppelin
2018-04-15 09:44:54 +08:00
@duan602728596
不是要用 socket,是要通过设置 sockettimeout 实现 http timout
多么普通的需求 因为 js 没暴露 socket 对象不能操作
和 websocket 没一毛钱关系
lolizeppelin
2018-04-15 09:47:43 +08:00
@Lxxyx
无论什么 timeout 都要通过 socket 设置...请问 axios 是通过什么方式控制了 socket 的 timeout 的?
learnshare
2018-04-15 10:01:09 +08:00
lolizeppelin
2018-04-15 10:09:00 +08:00
@Lxxyx
稍微看了一下 通过 XMLHttpRequest 的 abort()可以让底层的 socket 强制断开?

- -abort 是什么鬼 orz

也是说 js 能直接控制的最底层的方法是 XMLHttpRequest ?
duan602728596
2018-04-15 10:15:14 +08:00
@lolizeppelin 如果是 xhr,我记得是可以设置超时时间的。fetch 的话,fetch 可以在发送请求后设置定时器,判断在规定时间内是否有数据返回,不过嵌套的 Promise 很蛋疼
jin5354
2018-04-15 10:26:13 +08:00
fetch API 没有暴露 timeout,接触不到 socket 没救
你只能用 Promise.race 曲线实现超时
lolizeppelin
2018-04-15 10:28:00 +08:00
@duan602728596
@learnshare

这些都只能让自己函数结束没关闭底层连接....我要的是正常的关闭连接.....

话说设置 http 请求超时时间又不是什么偏门的的需求,fetch 为什么就不实现呢......
duan602728596
2018-04-15 10:39:42 +08:00
VDimos
2018-04-15 10:42:11 +08:00
fetch 不行,xmlhttprequest 有个 timeout 属性。这个我需求的确挺偏的
lolizeppelin
2018-04-15 10:48:31 +08:00
@duan602728596
谢谢我试试
breeswish
2018-04-15 11:35:15 +08:00
浏览器端底层的 socket 是不暴露的,例如你不能使用 http 或 websocket 以外的协议。至于为啥这样做……至少安全性上有这样的要求。
wwqgtxx
2018-04-15 12:41:44 +08:00
要是能那么容易暴露底层 socket 的话,还要 websocket 干嘛,各种类库早就自己跑私有协议了。
要说为什么,你要是暴露底层 socket 这样就能轻松绕过 cros 规则,浏览器的各种安全规则全都形同虚设了
codehz
2018-04-15 12:49:57 +08:00
tommyZZM
2018-04-15 13:39:43 +08:00
题主这个需求,跟 socket 不 socket 没什么关系
tommyZZM
2018-04-15 13:44:22 +08:00
```
// example
let someReq = timeout_ms => new Promise((resolve, reject) => {
let timeout = setTimeout(_ => reject(), timeout_ms);
fetch(...).then(resolve, reject).then(_ => clearTimeout(timeout));
});

// useage
someReq(1000);
```
BOYPT
2018-04-15 13:52:28 +08:00
记得 jquery 里面 timeout 的实现是开个定时器,超时没返回就 reject,
seeker
2018-04-15 14:03:54 +08:00
- 不用 socket 也可以达到你的需求
- 浏览器中的 js 控制不了原生的 socket
- 平台是浏览器,浏览器实现了 socket 的封装

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX