版本

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 一個 Can't render headers after they are sent to the client. 錯誤。

規則詳情

此規則旨在確保在主要函式區塊之外使用的回呼函式,始終是 return 陳述式的一部分或緊接在 return 陳述式之前。此規則根據被呼叫函式的名稱來判斷什麼是回呼函式。

選項

該規則採用單一選項 - 一個可能的回呼函式名稱陣列,其中可能包含物件方法。預設回呼函式名稱為 callbackcbnext

預設回呼函式名稱

此規則在預設選項 ["callback", "cb", "next"] 下的不正確程式碼範例

在線上編輯器中開啟
/*eslint callback-return: "error"*/

function foo(err, callback) {
    if (err) {
        callback(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(err);
    }
    done();
}

function bar(err, send) {
    if (err) {
        send.error(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 中引入的。

延伸閱讀

資源

變更語言