Node.js Express API:如何处理多个回调
我有一个API端点,它执行一个函数,该函数依次通过web套接字侦听一些事件,然后通过对API端点的回调将其响应抛出,因此端点可以使用此对象响应http请求 有时我只收到一个事件,有时我从侦听器收到两个事件。当只有第一个事件出现时,我没有问题。因为第二个事件具有优先级,所以我使用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
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!?旧版本没有涵盖所有情况,以防止回调被多次调用。