node-fetch:为啥推荐使用“signal”而不是“timeout”?
Posted
技术标签:
【中文标题】node-fetch:为啥推荐使用“signal”而不是“timeout”?【英文标题】:node-fetch: why is `signal` recommended over `timeout`?node-fetch:为什么推荐使用“signal”而不是“timeout”? 【发布时间】:2019-06-09 18:55:52 【问题描述】:node-fetch
文档建议使用 signal
而不是 timeout
,但没有提供任何提示:
// These properties are part of the Fetch Standard
...
signal: null, // pass an instance of AbortSignal to optionally abort requests
// The following properties are node-fetch extensions
...
timeout: 0, // req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies). Signal is recommended instead.
...
(来源:https://www.npmjs.com/package/node-fetch)
这是为什么呢?什么情况下使用timeout
会有问题?
【问题讨论】:
我不完全确定(因此我为什么要评论而不是提交答案),但我的猜测是使用超时不是问题,使用信号更灵活. AbortSignal 可以做超时可以做的所有事情,但它也可以在除超时之外的许多其他触发器上中止(例如来自其他系统的传入事件)。我认为这就是为什么它更受欢迎:更广泛的可用性。同样,我可能完全错了。 【参考方案1】:timeout
选项是node-fetch
专有扩展,不属于WhatWG fetch standard。
在构建时,AbortController
尚不存在于标准中,因此库提供了timeout
作为解决方法。
将非标准功能添加到应该尽可能准确地实现标准的库中存在问题:
当人们使用库时,额外的功能往往会“悄悄溜出”:如果他们使用该功能,则代码可能不会面向未来:如果他们出于某种原因必须更换库,他们的代码可能不会与不具有附加功能的标准的其他实现兼容。这是technical debt 的一种形式。 其他代码可能期望实现与标准完全匹配并且无法编译,例如在使用 TypeScript 时。在这种情况下,无法使用该库。 现在AbortController
存在,库必须维护两种中止请求的方式,这意味着更多的维护工作和more potential bugs。
通过阻止使用此非标准功能,当作者最终deprecate and remove 该功能时,将有更少的代码被破坏。
【讨论】:
【参考方案2】:在您的代码超时的 cmets 中只是一个节点获取扩展。 AbortSignal 是新的(未来?)标准取消方式,也是唯一可以取消fetch
的跨平台方式@
【讨论】:
节点获取扩展是什么意思?很可能只是将timeout
传递给底层http.request
选项:nodejs.org/api/http.html#http_http_request_url_options_callback
@caub 它是 whatwg 标准的扩展 - 即不是 node-fetch 寻求实现的官方“获取”规范的一部分。 fetch.spec.whatwg.org以上是关于node-fetch:为啥推荐使用“signal”而不是“timeout”?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MySQL WorkBench 在使用游标时忽略了我的 SIGNAL SQLSTATE?
为啥 multiprocessing.Process 没有 send_signal 方法?
为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?