callback-return
在回调之后要求 return
语句
此规则在 ESLint v7.0.0 中已 **弃用**。请在 eslint-plugin-n
中使用相应的规则。
回调模式是 JavaScript 中大多数 I/O 和事件驱动编程的核心。
function doSomething(err, callback) {
if (err) {
return callback(err);
}
callback();
}
为了防止多次调用回调,重要的是在回调在主函数体之外触发时 return
。忽略此技巧通常会导致您多次执行某项操作的问题。例如,在 HTTP 请求的情况下,您可能会尝试多次发送 HTTP 标头,导致 Node.js throw
a Can't render headers after they are sent to the client.
错误。
规则详情
此规则旨在确保在主函数块之外使用的回调始终是 return
语句的一部分或紧接其前。此规则根据被调用函数的名称来决定什么是回调。
选项
此规则采用单个选项 - 一个可能的回调名称数组 - 它可能包括对象方法。默认回调名称为 callback
、cb
、next
。
默认回调名称
此规则使用默认 ["callback", "cb", "next"]
选项的 不正确 代码示例
/*eslint callback-return: "error"*/
function foo(err, callback) {
if (err) {
;
}
callback();
}
此规则使用默认 ["callback", "cb", "next"]
选项的 正确 代码示例
/*eslint callback-return: "error"*/
function foo(err, callback) {
if (err) {
return callback(err);
}
callback();
}
提供的回调名称
此规则使用 ["done", "send.error", "send.success"]
选项的 不正确 代码示例
/*eslint callback-return: ["error", ["done", "send.error", "send.success"]]*/
function foo(err, done) {
if (err) {
;
}
done();
}
function bar(err, send) {
if (err) {
;
}
send.success();
}
此规则使用 ["done", "send.error", "send.success"]
选项的 正确 代码示例
/*eslint callback-return: ["error", ["done", "send.error", "send.success"]]*/
function foo(err, done) {
if (err) {
return done(err);
}
done();
}
function bar(err, send) {
if (err) {
return send.error(err);
}
send.success();
}
已知限制
由于很难通过静态分析来理解程序的含义,因此此规则存在限制
- 假阴性 当此规则报告正确代码时,但程序多次调用回调(这是不正确的行为)
- 假阳性 当此规则报告不正确的代码时,但程序只调用一次回调(这是正确的行为)
通过引用传递回调
此规则的静态分析不会检测到如果回调是函数的参数(例如,setTimeout
),程序是否调用回调。
此规则报告正确代码时的 假阴性 示例
/*eslint callback-return: "error"*/
function foo(err, callback) {
if (err) {
setTimeout(callback, 0); // this is bad, but WILL NOT warn
}
callback();
}
在嵌套函数中触发回调
此规则的静态分析不会检测到程序是否从嵌套函数或立即调用函数表达式 (IIFE) 中调用回调。
此规则报告正确代码时的 假阴性 示例
/*eslint callback-return: "error"*/
function foo(err, callback) {
if (err) {
process.nextTick(function() {
return callback(); // this is bad, but WILL NOT warn
});
}
callback();
}
if/else 语句
此规则的静态分析不会检测到程序是否在 if
语句的每个分支中只调用一次回调。
此规则报告不正确的代码时的 假阳性 示例
/*eslint callback-return: "error"*/
function foo(err, callback) {
if (err) {
callback(err); // this is fine, but WILL warn
} else {
callback(); // this is fine, but WILL warn
}
}
何时不使用它
在某些情况下,您可能希望多次调用回调函数。在这些情况下,此规则可能会导致不正确行为。在这些情况下,您可能希望为这些回调保留一个特殊名称,并且不要将其包含在触发警告的回调列表中。
相关规则
版本
此规则是在 ESLint v1.0.0-rc-1 中引入的。