node-fetch:为什么建议使用“信号”而不是“超时”?

时间:2019-01-15 17:51:20

标签: node.js node-fetch

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会成为问题?

2 个答案:

答案 0 :(得分:0)

正如代码注释中的注释一样,它只是一个节点获取扩展。 AbortSignal是取消的新(未来?)标准方法,并且是取消fetch

的唯一跨平台方法

答案 1 :(得分:0)

timeout选项是node-fetch的专有扩展,不属于WhatWG fetch standard的一部分。

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

向应该尽可能准确地实现标准的库中添加非标准功能会出现问题:

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

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