为何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
相关产品推荐
相关产品推荐

