以下代码,我找不到任何问题,但是,它有时输出 "'我'不应高于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
时会返回该函数,并且下面的代码永远不会运行,这个问题确实让我感到疯狂。
答案 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();
}
或类似的东西。