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

Websocket - Waiting for a http request callback to execute before next pusher event

所以我正在使用 websockets 来处理来自网站 API 的数据。对于每个新事件,我还会向网站发送一些 http 请求以获取更多数据。直到现在一切都运行良好,但现在我开始使用异步请求来加快速度,情况有所不同。我的代码过去常常处理一个事件,然后继续处理下一个事件(这些事件发生得非常快——大约每秒 10 个)但现在它似乎只是忽略了异步(非阻塞)部分并继续处理下一个事件和这样它就跳过了一半以上的代码。请注意,代码在 Pusher 之外工作正常。我正在使用 'pusher-client' 模块。我的代码如下所示:

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 而不是回调。您的代码将更易于阅读和维护。