Websocket - 在下一个推送器事件之前等待 http 请求回调执行



所以我正在使用websockets来处理来自网站API的数据。对于每个新事件,我还会将一些http请求发送回网站,以获取更多数据。到目前为止,一切正常,但是现在我开始使用异步请求来加快速度,事情变得有些不同。我的代码曾经处理一个事件,然后继续下一个事件(这些事件来得非常快 - 每秒大约 10 个),但现在它似乎只是忽略了异步(非阻塞)部分并继续下一个事件,这样它只是跳过了一半的代码。请注意,代码在推送器之外工作正常。我正在使用"推送器客户端"模块。我的代码如下所示:

var Request = require("request");
var requestSync = require('sync-request');
var Pusher = require('pusher-client');
var events_channel = pusher.subscribe('inventory_changes');
events_channel1.bind('listed', function(data)
{
var var2;
//Async request (to speed up the code)
function myFunction(callback){
request("url", function(error, response, body) {
if (!error && response.statusCode == 200) 
{
result = JSON.stringify(JSON.parse(body));
return callback(null, result);
} 
else 
{
return callback(error, null);
}
});
}
myFunction(function(err, data){
if(!err)
{
var2 = data
return(data);
}
else
{
return(err);
}
});

//The part of the code below waits for the callback and the executes some code
var var1 = var2;
check();
function check() 
{
if(var2 === var1)
{
setTimeout(check, 10);
return;
}
var1 = var2;
//A CHUNK OF CODE EXECUTES HERE (connected to the data from the callback)
}
});

总之,代码可以工作,但由于推送器跳过异步请求,因此不在推送器内部。在处理下一个事件之前,我将如何让推送器等待我的异步请求完成(我不知道)?如果你碰巧知道,请让我知道:)

您需要实现一个队列来处理一个接一个的事件。我很好奇它以前是如何工作的,即使没有Pusher你也必须为它实现一些队列机制。

const eventsQueue = []
events_channel1.bind('listed', function(data) {
eventsQueue.push(data)
handleNewEvent()
})
let processingEvent = false
function handleNewEvent() {
if (processingEvent) return // do nothing if already processing an event
processingEvent = true
const eventData = eventsQueue.shift() // pick the first element from array
if (!eventData) return // all events are handled at the moment
... // handle event data here
processingEvent = false
handleNewEvent() // handle next event
}

此外,您应该调用clearTimeout方法来清除超时;不再需要它了。

最好使用承诺或async/await而不是回调。您的代码将更易于阅读和维护。

最新更新