Node.js Express API:如何处理多个回调

Node.js Express API:如何处理多个回调,node.js,api,express,callback,http-headers,Node.js,Api,Express,Callback,Http Headers,我有一个API端点,它执行一个函数,该函数依次通过web套接字侦听一些事件,然后通过对API端点的回调将其响应抛出,因此端点可以使用此对象响应http请求 有时我只收到一个事件,有时我从侦听器收到两个事件。当只有第一个事件出现时,我没有问题。因为第二个事件具有优先级,所以我使用setTimeout等待它,以防它仍然出现 问题在于,当第二个事件出现时,我的API端点用它的对象进行响应,但之后它崩溃了。我想这与第二次回调有关,我不知道如何处理它。以下是代码的结构: app.get('/api/mye

我有一个API端点,它执行一个函数,该函数依次通过web套接字侦听一些事件,然后通过对API端点的回调将其响应抛出,因此端点可以使用此对象响应http请求

有时我只收到一个事件,有时我从侦听器收到两个事件。当只有第一个事件出现时,我没有问题。因为第二个事件具有优先级,所以我使用
setTimeout
等待它,以防它仍然出现

问题在于,当第二个事件出现时,我的API端点用它的对象进行响应,但之后它崩溃了。我想这与第二次回调有关,我不知道如何处理它。以下是代码的结构:

app.get('/api/myendpoint', function(req, res) {

    myVar_1 = req.query.myvar1;
    myVar_2 = req.query.myvar2;

    myFunction(myVar_1, myVar_2, function(data, error) {
        if (!error) res.json(data);
        else res.json({"error": String(error)});        
    });

});


function myFunction(myVar_1, myVar_2, callback){

    listenOnSocket.someEvent(myVar_1,
        function(error, event) {
            if (error) callback(null, error);
            else setTimeout(function() {callback(event, null);}, 6000);
        }
    );    

    listenOnSocket.someEvent(myVar_2,
        function(error, event) {
            if (!error) callback(event, null); 
            else callback(null, error);
        }
    );

};
我的错误是这样的:

错误[ERR\u HTTP\u HEADERS\u SENT]:发送后无法设置头 给客户


为什么会这样?

  • 1st
    事件发生,在该事件中,您为
    6000
    ms设置
    超时以调用回调函数
  • 2nd
    事件发生在
    6000
    之前,由于事件
    2
    而执行回调。回复发送到这里
  • timeout
    完成,传递给
    setTimeout
    的挂起函数执行回调,该回调将再次发送响应,并且在发送响应后无法向响应发送头
  • 解决方案

    一个基本的解决方案是检查传递给设置超时的函数中的标志变量,以确定是否发生了
    2nd
    事件

    function myFunction(myVar_1, myVar_2, callback){
    
        let executed = false;
        listenOnSocket.someEvent(myVar_1,
            function(error, event) {
                if(!executed){
                executed = true
                if (error) callback(null, error);
                else setTimeout(function() {
                           callback(event, null);
                        }, 6000);
            }
           }
        );    
    
        listenOnSocket.someEvent(myVar_2,
            function(error, event) {
                if(!executed){
                executed = true;
                if (!error) callback(event, null); 
                else callback(null, error);
            }
           }
        );
    
    };
    

    我注意到
    myFunction
    包含两个参数,但是在请求处理程序中用三个和那个调用,
    myFunction
    的主体调用回调函数,而回调函数未在函数中定义。更新了code@quiltykim我想发生的是第一次发生
    1st
    事件,您设置了在一个时间间隔后调用回调函数的超时。然后发生
    2nd
    事件,它执行回调并发送头。然后,当超时完成并执行第一个函数的回调时,您将再次发送响应。可能会有一个标志,在触发任何事件时设置它,并在调用回调之前检查该标志,以便在调用回调时不会调用它。基本上,您必须确保在其被调用后不会再次调用它。此错误是由于多次执行回调而产生的。你必须避免这样。我认为评论是未来用户参考的好来源。所以最好不要删除这些。我不明白为什么这样做有效。你的第一个版本对我来说更有意义。在这种情况下,如果首先抛出第一个事件,如果setTimeout停止回调,则无法执行第二个事件,因为
    executed
    已为True!?旧版本没有涵盖所有情况,以防止回调被多次调用。