条件满足时,js函数不返回

时间:2018-02-23 02:57:21

标签: javascript node.js

以下代码,我找不到任何问题,但是,它有时输出 "'我'不应高于handlers.length"。

function callNext(req, res, handlers, cb) {
    let i = -1;
    let next = (thisObj) => {
        i += 1;

        if (i == handlers.length) {
            return cb();
        } else if (i > handlers.length) {
            console.log("'i' should not be higher than handlers.length.");
            console.log(handlers.length, i); // => 9 10
            return;
        }

        try {
            return handlers[i].call(thisObj || this, req, res, next);
        } catch (e) {
            this.onerror(e, req, res);
        }
    };

    return next();
}

因为基于人类逻辑,当i等于handlers.length时会返回该函数,并且下面的代码永远不会运行,这个问题确实让我感到疯狂。

2 个答案:

答案 0 :(得分:1)

最简单的假设是某些处理程序错误地调用next两次。

一般来说,我会建议再次保护这个,你可以使用像

这样的东西
function callNext(req, res, handlers, cb) {
   let lastCalledIndex;
   let next = (thisObj, index) => {
       if (index === lastCalledIndex) { 
           console.log("'next' called multiple times from handler");
           return; 
       }
       lastCalledIndex = index;
       if (i === handlers.length) {
           return cb();
       } else if (index > handlers.length) {
           console.log("'index' should not be higher than handlers.length.");
           console.log(handlers.length, index); // => 9 10
           return;
       }

       try {
           return handlers[index].call(thisObj || this, req, res, next.bind(undefined, thisObj, index + 1));
       } catch (e) {
           this.onerror(e, req, res);
       }
    };

    return next(this, 0);
}

答案 1 :(得分:0)

之所以发生这种情况,是因为i会在if (i == handlers.length) return cb();之后的下一次通话中增加并成为handlers.length + 1

你必须做

    if (i >= handlers.length) {
        return cb();
    }

或类似的东西。