【问题标题】:Why should I return from a .then() in every case?为什么在每种情况下我都应该从 .then() 返回?
【发布时间】:2019-06-13 08:37:31
【问题描述】:

我正在使用 ESLint,但出现此错误:每个 then() 都应该返回一个值或抛出 promise/always-return

代码:

return somePromise.then(result => {
    console.log(result);
}).catch(error => {
    console.error(error);
});

我为什么要兑现这个承诺?显然不需要它,因为我只想在日志中打印结果,仅此而已。这条规则似乎不适用于所有情况。 我正在编写一个 Firebase 数据库触发器,我认为它只对知道承诺是否已解决感兴趣。

【问题讨论】:

  • 如果您认为该规则没有用,请将其禁用。但 IMO 最好总是返回一个值,否则承诺的消费者会将 undefined 视为参数,这很可能会造成混淆。
  • 我认为您正在做两件相互冲突的事情:1)返回承诺和 2)不返回值。如果您要返回承诺,则返回其值并重新抛出.catch()。如果您不关心传递值,那么您可能也不需要返回承诺。
  • 我需要返回承诺,因为 Firebase 函数需要知道我的异步任务已经完成。 Firebase 对解析值中的内容没有任何用处。这就是为什么我没有从 then() 函数返回任何东西。
  • @harsh989 Firebase 是否也不需要区分成功和错误情况?

标签: javascript node.js ecmascript-6 promise eslint


【解决方案1】:

This eslint-plugin-promise rule 的存在是为了防止由于未链接的 Promise 导致的错误:

return somePromise.then(result => {
   anotherPromise.then(...);
});

如果您认为您无法从该规则中受益,并且它只会使您的代码中出现额外的 return 语句或 eslint-disable-* cmets,请禁用它。

Bluebird 以防止此类错误而闻名,它会生成 a warning 以防出现嵌套的未链接承诺。

【讨论】:

  • @NikKyriakides 该库保留了在调用 then 回调时创建的其他 Bluebird Promise 的列表,然后它检查该列表并检查回调是否返回了某些内容。这只有在所有涉及的 Promise 都是 Bluebird 时才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2014-09-12
  • 2018-04-26
相关资源
最近更新 更多