【问题标题】: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 可以做超时可以做的所有事情,但它也可以在除超时之外的许多其他触发器上中止(例如来自其他系统的传入事件)。我认为这就是为什么它更受欢迎:更广泛的可用性。同样,我可能完全错了。

标签: node.js node-fetch


【解决方案1】:

timeout 选项是node-fetch 专有扩展,不属于WhatWG fetch standard

在构建时,AbortController 尚不存在于标准中,因此库提供了timeout 作为解决方法。

将非标准功能添加到应该尽可能准确地实现标准的库中存在问题:

  • 当人们使用库时,额外的功能往往会“悄悄溜出”:如果他们使用该功能,则代码可能不会面向未来:如果他们出于某种原因必须更换库,他们的代码可能不会与不具有附加功能的标准的其他实现兼容。这是technical debt 的一种形式。
  • 其他代码可能期望实现与标准完全匹配并且无法编译,例如在使用 TypeScript 时。在这种情况下,无法使用该库。
  • 现在AbortController 存在,库必须维护两种中止请求的方式,这意味着更多的维护工作和more potential bugs

通过阻止使用此非标准功能,当作者最终deprecate and remove 该功能时,将有更少的代码被破坏。

【讨论】:

    【解决方案2】:

    在您的代码超时的 cmets 中只是一个节点获取扩展。 AbortSignal 是新的(未来?)标准取消方式,也是唯一可以取消fetch的跨平台方式@

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2013-12-10
    • 2016-02-23
    • 2017-11-04
    • 2011-10-22
    • 2011-04-11
    • 2021-10-12
    • 2012-12-07
    相关资源
    最近更新 更多