回调未返回

Callback not returning

本文关键字:返回 回调      更新时间:2023-09-26

由于某种原因,我看到了最后一个回调命中,即使它确实进入了第一个if语句。当我执行response(res)时,它不应该首先返回吗?其实不是。由于某些原因,它仍然继续并命中第二个响应(res):

function find(response){
    var res = {};
    res.statusCode = 200;
    var data = _gateway.find();
    if(!data){
        res.statusCode = 204;
        res.body = null;
        console.log("SETTING RESPONSE BODY TO NULL");
        response(res);
    }
    console.log("SHHHHHHHHHHHHHOULD NOT GET HERE");
    res.body = data;
    response(res);
};

调用回调并不意味着当前函数将在该点停止执行。这和调用其他函数是一样的。在您的示例中,一旦回调函数返回一个值,控制将仅转移到find函数,它将继续执行其余的语句。

要解决这个问题,您需要在回调返回后立即从find返回,如下所示

...
if(!data){
    res.statusCode = 204;
    res.body = null;
    console.log("SETTING RESPONSE BODY TO NULL");
    response(res);
    return;    // return from the `find` function
}
...

你甚至可以返回response的结果,像这样

return response(res);

使控制立即从find功能转移。

在response(res)后放置return语句,否则将尝试执行剩余语句或将其放入else部分