首页 > 解决方案 > Node.js:如何使用 async.js 和 websocket 处理回调?

问题描述

我正在创建一个 REST API 来存储来自通过 TCP 发送数据的特定相机的设置。相机通过 TCP 以请求/响应模式进行通信。
例如:您可以向相机发送“Get rate\n”,它会响应“100 fps”,以获得相机的当前帧率。

如何获取数据并将其存储在 API 中?

var command = "rate"; //Array with setting I want to store in my API

function getDataFromCamera(command) { // This function will be iterate in another function
    async.series([
        console.log('Test1'); // console log to test output
        function(callback) {

            CAMERA_TCP_SOCKET.send("get "+command+"\n");
            callback(null,command);
},
     function(callback) {
         console.log('Test2'); // console log to test output
         CAMERA_TCP_SOCKET.onmessage = function(event) {
         callback(null, event.data); // THIS line is the problem. I can't retrieve event.data because i don't know how to callback this variable
     }
}],
     function(err, results) {
         if (err) {
        //Handle the error in some way. Here we simply throw it
             throw err;
         }
         if (results) {
             console.log(results); // expected output : // ['rate','100']
         }
    });
}

目前,我收到此错误:

Test1
Test2
/Users/maximecongi/Desktop/Hologram/node_modules/async/dist/async.js:966
        if (fn === null) throw new Error("Callback was already called.");
                         ^

Error: Callback was already called.
    at /Users/maximecongi/Desktop/Hologram/node_modules/async/dist/async.js:966:32
    at /Users/maximecongi/Desktop/Hologram/node_modules/async/dist/async.js:3885:13
    at W3CWebSocket.CAMERA_TCP_SOCKET.onmessage (/Users/maximecongi/Desktop/Hologram/core/api.js:91:13)
    at W3CWebSocket._dispatchEvent [as dispatchEvent] (/Users/maximecongi/Desktop/Hologram/node_modules/yaeti/lib/EventTarget.js:107:17)
    at W3CWebSocket.onMessage (/Users/maximecongi/Desktop/Hologram/node_modules/websocket/lib/W3CWebSocket.js:234:14)
    at WebSocketConnection.<anonymous> (/Users/maximecongi/Desktop/Hologram/node_modules/websocket/lib/W3CWebSocket.js:205:19)
    at WebSocketConnection.emit (events.js:188:13)
    at WebSocketConnection.processFrame (/Users/maximecongi/Desktop/Hologram/node_modules/websocket/lib/WebSocketConnection.js:554:26)
    at /Users/maximecongi/Desktop/Hologram/node_modules/websocket/lib/WebSocketConnection.js:323:40
    at process.internalTickCallback (internal/process/next_tick.js:70:11)
[nodemon] app crashed - waiting for file changes before starting...

如何解决我的问题?

标签: javascriptnode.jsasynchronouswebsocket

解决方案


这是因为您正在收听每条消息,并且看起来您正在发送 3 个命令,我猜,每个命令都会得到响应。第一个系列之后的回调没有被破坏,它还活着。对我来说,您应该检查响应是否针对此特定命令,然后执行有问题的回调。


推荐阅读