fetch 不提供 timeout,只能设定时器让函数退出但控制不了实际 socket
尝试了下搜索找 js 设置 socket timeout 居然是其他模块的
fecth 底层的 sokcet 是咋弄的?
虽然见过用过的语言不多...但还真没见过 js 这样不暴露 socket 的.....想 http 请求设置 timeout 就这么难?
1 rookiebulls 2018-04-15 09:36:29 +08:00 via iPhone ![]() axios 了解一下 |
![]() | 2 Lxxyx 2018-04-15 09:37:22 +08:00 via Android XHR 有 timeout,fetch 是 promise,目前浏览器还不支持 abort 方法。你可以看 axios 的 cancel Token 实现,我用那个实现过 fetch 的 timeout |
![]() | 3 duan602728596 2018-04-15 09:42:58 +08:00 via iPhone 想用 socket,请使用 html5 的 WebSocket |
4 lolizeppelin OP @duan602728596 不是要用 socket,是要通过设置 sockettimeout 实现 http timout 多么普通的需求 因为 js 没暴露 socket 对象不能操作 和 websocket 没一毛钱关系 |
5 lolizeppelin OP @Lxxyx 无论什么 timeout 都要通过 socket 设置...请问 axios 是通过什么方式控制了 socket 的 timeout 的? |
![]() | 6 learnshare 2018-04-15 10:01:09 +08:00 |
7 lolizeppelin OP @Lxxyx 稍微看了一下 通过 XMLHttpRequest 的 abort()可以让底层的 socket 强制断开? - -abort 是什么鬼 orz 也是说 js 能直接控制的最底层的方法是 XMLHttpRequest ? |
![]() | 8 duan602728596 2018-04-15 10:15:14 +08:00 via iPhone @lolizeppelin 如果是 xhr,我记得是可以设置超时时间的。fetch 的话,fetch 可以在发送请求后设置定时器,判断在规定时间内是否有数据返回,不过嵌套的 Promise 很蛋疼 |
![]() | 9 jin5354 2018-04-15 10:26:13 +08:00 fetch API 没有暴露 timeout,接触不到 socket 没救 你只能用 Promise.race 曲线实现超时 |
10 lolizeppelin OP @duan602728596 @learnshare 这些都只能让自己函数结束没关闭底层连接....我要的是正常的关闭连接..... 话说设置 http 请求超时时间又不是什么偏门的的需求,fetch 为什么就不实现呢...... |
![]() | 11 duan602728596 2018-04-15 10:39:42 +08:00 ![]() |
12 fetch 不行,xmlhttprequest 有个 timeout 属性。这个我需求的确挺偏的 |
13 lolizeppelin OP @duan602728596 谢谢我试试 |
![]() | 14 breeswish 2018-04-15 11:35:15 +08:00 浏览器端底层的 socket 是不暴露的,例如你不能使用 http 或 websocket 以外的协议。至于为啥这样做……至少安全性上有这样的要求。 |
![]() | 15 wwqgtxx 2018-04-15 12:41:44 +08:00 ![]() 要是能那么容易暴露底层 socket 的话,还要 websocket 干嘛,各种类库早就自己跑私有协议了。 要说为什么,你要是暴露底层 socket 这样就能轻松绕过 cros 规则,浏览器的各种安全规则全都形同虚设了 |
![]() | 16 codehz 2018-04-15 12:49:57 +08:00 ![]() |
![]() | 17 tommyZZM 2018-04-15 13:39:43 +08:00 题主这个需求,跟 socket 不 socket 没什么关系 |
![]() | 18 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); ``` |
19 BOYPT 2018-04-15 13:52:28 +08:00 记得 jquery 里面 timeout 的实现是开个定时器,超时没返回就 reject, |
20 seeker 2018-04-15 14:03:54 +08:00 - 不用 socket 也可以达到你的需求 - 浏览器中的 js 控制不了原生的 socket - 平台是浏览器,浏览器实现了 socket 的封装 |
21 azh7138m 2018-04-15 14:15:45 +08:00 via Android Promise.race +1 自己封装一下也不麻烦 |
22 lolizeppelin OP |
![]() | 23 porrat 2018-04-15 15:39:33 +08:00 via iPhone ![]() 整天底层底层,你咋不自己捡石头刻一个 COU 呢 |
![]() | 24 porrat 2018-04-15 15:39:48 +08:00 via iPhone 打错了,CPU |
![]() | 25 qiuyk 2018-04-15 15:59:06 +08:00 ![]() |
26 GabrielChen 2018-04-15 16:45:15 +08:00 这个楼主有点意思 |
![]() | 29 lzvezr 2018-04-15 19:45:38 +08:00 via Android 总感觉楼主应该是个习惯看文档的人,如果是这样的话,文档没提供的就是不支持 |
30 azh7138m 2018-04-15 19:48:58 +08:00 via Android @lolizeppelin 我不兼容低于 chrome57 的:) |
31 azh7138m 2018-04-15 19:52:32 +08:00 via Android 蛤,看了下β才有这个,我觉得 race 可以,不懂为啥非要这个玩意 |
32 lolizeppelin OP |
![]() | 33 zzNucker 2018-04-15 23:27:19 +08:00 ![]() 楼主连 js 都学不明白还有脸说别人是只写 js 的前端,笑死我了 |
34 archliinux 2018-04-16 00:51:03 +08:00 via Android ![]() 楼主就是以前那个用浏览器跑定时任务的 php 大神.. |
![]() | 35 wwqgtxx 2018-04-16 00:59:49 +08:00 @archliinux 我就说这 ID 看着眼熟就是想不起来之前在哪里见过 |
![]() | 36 Sparetire 2018-04-16 04:30:34 +08:00 via Android ![]() 不暴露 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 断了没有我也不知道,这取决于浏览器的实现了,真想知道的话,抓个包看看也不是什么难事 作为学习去了解底层细节无可厚非,但是作为接口的使用者,不需要也不应该去纠结底层的实现,本来就应该面向接口而不是面向具体实现编程,浏览器厂商很好地屏蔽了底层细节反而做得很正确 |
![]() | 37 Bryan0Z 2018-04-16 08:07:50 +08:00 via Android @archliinux 没看到记录里有啊 |
![]() | 38 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 接口到底在干什么。 可问题是你这个功能需求,跟底层不底层没什么关系 |
39 lolizeppelin OP @tommyZZM 应该是我表达有误用了底层这个词..... 我其实也不想关心 socket 接口 只是因为 fetch 是我见过的第一个没带 http 超时参数的 http 客户端 api 然后 fetch 又几乎是浏览器端的新标准,我又不熟 JS,所以没办法才想去折腾 socket @archliinux 第一:别人给出了解决方法,您进来就只做嘲讽 第二:你是真认错了人还是故意随便扣个帽子方便嘲讽? @zzNucker 才学 js 没几天,让您见笑了 |
![]() | 40 tommyZZM 2018-04-16 13:19:01 +08:00 @lolizeppelin Web API 的 xhr 和 fetch 都没有超时参数的,原因很简单。 因为可以通过 js 逻辑进行超时判断,所以规范设计者认为没有必要。 这个具体细节可以自行查询了解,至于如何实现超时,上面众多 V 友已经给出答复和方案了。 如果想要了解这个问题的资料,可以轻易的通过 google 查询 timeout、fetch、xmlhttprequest、why 等关键词获取更多你想要的信息。 嘲讽态度的回复如`只写 js 的前端`、`js 写起来逼疯 `,对你了解这个问题毫无帮助。 |