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

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

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

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

fecth 底层的 sokcet 是咋弄的?

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

8616 次点击
所在节点    JavaScript
40 条回复
azh7138m
2018-04-15 14:15:45 +08:00
Promise.race +1
自己封装一下也不麻烦
lolizeppelin
2018-04-15 14:51:16 +08:00
@tommyZZM
@azh7138m

axios 基于 xmlhttprequest 可以做到
fetch 需要 AbortController 支持才能做到,AbortController 需要对浏览器版本要求高

说 Promise 做得到的你们都是只写 js 的前端吧?只要自己函数能正常就行了,完全不关心底层连接的?
porrat
2018-04-15 15:39:33 +08:00
整天底层底层,你咋不自己捡石头刻一个 COU 呢
porrat
2018-04-15 15:39:48 +08:00
打错了,CPU
qiuyk
2018-04-15 15:59:06 +08:00
GabrielChen
2018-04-15 16:45:15 +08:00
这个楼主有点意思
Yooe
2018-04-15 16:45:19 +08:00
@qiuyk 哈哈哈,也许应该写 C++或 C,才没这些问题吧。。。。
qiuyk
2018-04-15 16:55:19 +08:00
@Yooe 哈哈哈哈 其实没别的意思 就是感觉楼主要被逼疯了 觉得有点好玩而言
lzvezr
2018-04-15 19:45:38 +08:00
总感觉楼主应该是个习惯看文档的人,如果是这样的话,文档没提供的就是不支持
azh7138m
2018-04-15 19:48:58 +08:00
@lolizeppelin 我不兼容低于 chrome57 的:)
azh7138m
2018-04-15 19:52:32 +08:00
蛤,看了下β才有这个,我觉得 race 可以,不懂为啥非要这个玩意
lolizeppelin
2018-04-15 21:44:49 +08:00
@qiuyk
js 写起来是有点被逼疯

@azh7138m
因为虽然页面里 js 正常运行但是 socket 还一直在工作,而且会完成的本来要做的工作..... Promise race 的做法只是当没看见然后不再理会而已...

@lzvezr
因为我实在不明白为什么这么基本的 http 请求超时接口里居然没有让我怀疑自己不会用....
zzNucker
2018-04-15 23:27:19 +08:00
楼主连 js 都学不明白还有脸说别人是只写 js 的前端,笑死我了
archliinux
2018-04-16 00:51:03 +08:00
楼主就是以前那个用浏览器跑定时任务的 php 大神..🐶
wwqgtxx
2018-04-16 00:59:49 +08:00
@archliinux 我就说这 ID 看着眼熟就是想不起来之前在哪里见过
Sparetire
2018-04-16 04:30:34 +08:00
不暴露 socket 是浏览器安全策略的要求,浏览器的 http api 本来就是受限的,不要觉得自己会比浏览器厂商来得聪明
至于 fetch,自己用 xmlhttprequest 封装一下也没差
浏览器提供了中断请求和超时回调的接口
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout
https://developer.mozilla.org/en-US/docs/Web/Events/timeout
至于 socket 断了没有我也不知道,这取决于浏览器的实现了,真想知道的话,抓个包看看也不是什么难事
作为学习去了解底层细节无可厚非,但是作为接口的使用者,不需要也不应该去纠结底层的实现,本来就应该面向接口而不是面向具体实现编程,浏览器厂商很好地屏蔽了底层细节反而做得很正确
Bryan0Z
2018-04-16 08:07:50 +08:00
@archliinux 没看到记录里有啊
tommyZZM
2018-04-16 09:25:11 +08:00
@lolizeppelin

问题是你这个功能需求,跟底层不底层没什么关系

你想要看 fetch 底层,请直接阅读 Chromium 源码。

另外我想要指出的是,fecth 这个 API 是 Web API 提供的,严格来说,不是 JavaScript 标准库的一部分。

你在浏览器环境看到的是 xhr 或者 fetch。在 node.js 环境使用的可能就是 http 或其他什么模块。

它们底层确实是 C/C++的代码,只是暴露了接口在 JavaScript 引擎内可以通过 API 的方式调用而已

你可以思考一下,你调用一个 JavaScript 接口到底在干什么。

可问题是你这个功能需求,跟底层不底层没什么关系
lolizeppelin
2018-04-16 10:27:29 +08:00
@tommyZZM
应该是我表达有误用了底层这个词.....
我其实也不想关心 socket 接口
只是因为 fetch 是我见过的第一个没带 http 超时参数的 http 客户端 api
然后 fetch 又几乎是浏览器端的新标准,我又不熟 JS,所以没办法才想去折腾 socket

@archliinux
第一:别人给出了解决方法,您进来就只做嘲讽
第二:你是真认错了人还是故意随便扣个帽子方便嘲讽?

@zzNucker
才学 js 没几天,让您见笑了
tommyZZM
2018-04-16 13:19:01 +08:00
@lolizeppelin

Web API 的 xhr 和 fetch 都没有超时参数的,原因很简单。

因为可以通过 js 逻辑进行超时判断,所以规范设计者认为没有必要。

这个具体细节可以自行查询了解,至于如何实现超时,上面众多 V 友已经给出答复和方案了。

如果想要了解这个问题的资料,可以轻易的通过 google 查询 timeout、fetch、xmlhttprequest、why 等关键词获取更多你想要的信息。

嘲讽态度的回复如`只写 js 的前端`、`js 写起来逼疯 `,对你了解这个问题毫无帮助。

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

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

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

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

© 2021 V2EX