【问题标题】:Are method-chains self-aware?方法链有自我意识吗?
【发布时间】:2019-11-16 04:59:50
【问题描述】:

在包Super Agent中,文档状态:

可以通过调用适当的方法来发起请求 请求对象,然后调用 .then()(或 .end() 或 await)发送 请求。

request
   .get('/search')
   .then(res => {
      // res.body, res.headers, res.status
   });

不过 SuperAgent 支持方法链,例如

request.get('/search')
  .set('header1','value')
  .set('header2','value')

在发送之前修改请求。所以...

请求对象如何知道方法链何时完成,从而不会过早发送?

我的理论是,request 对象的任何链都会返回一个 thenable 对象,该对象可以是 await'd 或 .then()'d,当它是时,它将触发一个请求并返回一个实际的承诺。

我在超级代理回购中四处寻找,找不到类似的东西。在方法链完成之前等待发送请求怎么办?

【问题讨论】:

  • 是的。正如您引用的文档,“calling .then() or .end()”确实会发送请求。

标签: promise superagent


【解决方案1】:

只要找到源头并寻找,您就永远不会出错。因此,如果您查看the code for .then(),您会看到它自己调用了.end()

因此,当调用.then().end() 时发送请求。在那之前,其他方法只是配置请求对象。

而且,使用 await 将在 promise 上调用 .then()

此外,如果您在上述源文件参考中搜索.end,您将看到数十个代码示例,它们都在链的末尾显示.end()。这就是 superagent 的原始设计架构。然后,当 Promise 出现时,添加了对 .then() 的支持,并在内部使用 .end()

【讨论】:

  • 那么这是否意味着await也发送它,因为对象是thenable
  • @Jordan - 是的。 await 实际上调用了.then(),因为这是你知道何时完成承诺的唯一方法。
  • @Jordan await 没有魔法,它只是 calls .then if the awaited object is thenable
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 2019-02-19
  • 2011-10-02
  • 1970-01-01
  • 2011-12-13
  • 2020-10-01
相关资源
最近更新 更多