You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Promise的.then()需始终返回值?ESLint规则疑问

解惑ESLint promise/always-return:仅处理日志时的应对方案

嘿,我完全懂你的困惑——这个ESLint规则在你这种只需要执行日志打印、不需要给后续Promise链传值的场景下,确实显得有点严苛。咱们来拆解一下问题,再看看几种适合你的解决办法:

为啥会触发这个规则?

promise/always-return的设计初衷是帮你避免意外的Promise链断裂。想象一下,如果有人在你这个then()后面再加一个then(),那它拿到的会是undefined,很容易引发难以排查的异步bug。但在你的场景里——Firebase触发器只关心Promise有没有完成,根本不需要后续链,这个规则就有点“过度保护”了。

适合你的几种解决方式

1. 显式返回一个空值(最稳妥)

最简单的就是在回调末尾加个return;,明确告诉ESLint:“我就是故意不传值的”,既满足规则,又不影响逻辑:

return somePromise.then(result => {
  console.log(result);
  return; // 显式返回undefined,让ESLint放心
}).catch(error => {
  console.error(error);
  return;
});

2. 临时禁用该行的规则检查

如果你觉得加返回值纯属多余,可以用ESLint的注释直接跳过当前行的检查:

return somePromise.then(result => {
  console.log(result);
  // eslint-disable-next-line promise/always-return
}).catch(error => {
  console.error(error);
  // eslint-disable-next-line promise/always-return
});

要是整个触发器函数都不需要这个规则,也可以在函数上下方加块级注释开关:

/* eslint-disable promise/always-return */
exports.yourFirebaseTrigger = functions.database.ref('/path').onWrite((change) => {
  return somePromise.then(result => {
    console.log(result);
  }).catch(error => {
    console.error(error);
  });
});
/* eslint-enable promise/always-return */

3. 调整ESLint配置,放宽规则

如果你经常遇到这类“只处理副作用”的场景,可以在你的ESLint配置文件(比如.eslintrc.js)里给规则加个参数,允许最后一个回调不返回值:

module.exports = {
  // ...其他配置项
  rules: {
    "promise/always-return": ["error", {
      "ignoreLastCallback": true // 允许Promise链的最后一个回调不返回值
    }]
  }
};

不过这个配置要谨慎用,别真的漏掉了需要返回值的场景哦。

关于Firebase触发器的小补充

你说触发器只关心Promise是否完成——其实不管你返回undefined还是其他值,Firebase都会等这个Promise settle(完成或拒绝),所以显式返回空值完全不会影响触发器的行为,只是给ESLint一个“安心信号”而已。

内容的提问来源于stack exchange,提问作者skynew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:01:06