socket.io等待node.js中的响应

时间:2019-04-25 12:22:39

标签: javascript node.js socket.io

我正在尝试在事件发出后使用socket.on接收一个json文件,并在另一个文件中使用该响应。我对套接字的了解非常有限。这是代码。

主文件:

  const socketclass = require('../public/socket/client');
  await socketclass.emitMsg();
  let val = socketclass.receivedSch;
  console.log(val);

显然receivedSch的值是不确定的。

client.js

var socketIo = require('socket.io-client');
var socket = socketIo('http://localhost:9096');


exports.emitMsg = async function() {
    socket.emit('getSchema', () => {});
}

socket.on('resJson', (response) => {
    exports.receivedSch = response;
    return response;
});

resJson事件和JSON文件是通过9096端口从另一台服务器正确接收的。我只是不知道如何在let val = socketclass.receivedSch;

之前等待接收活动

仅返回response也可以用于我的研究,但是我不知道如何从socket.on内返回它

3 个答案:

答案 0 :(得分:0)

请按照给定的步骤进行操作以实现这一目标。

1)在文件中包含const EventEmitter = require('events');

2)在socket.on

之前创建事件发射器对象
const myEmitter = new EventEmitter();
socket.on('resJson', (response) => {
    exports.receivedSch = response;
    myEmitter.emit('got_response', response); //emit event (important)
});

3)使用myEmitter对象接收响应。

myEmitter.on('got_response', function(data) {
 //console.log(data);
});

这可能会对您有所帮助。

答案 1 :(得分:0)

您的 <?php echo 'Hello World'; 并未按照您的预期去做,exports.emitMsg关键字在这里除了返回一个可解析为未定义的承诺外,没有任何其他作用。

由于您的async是一个回调函数,因此您需要将其包装到socket.emit中。

所以尝试->

new Promise

要使您的exports.emitMsg = function() { return new Promise((resolve) => { socket.emit('getSchema', resolve); }); } 真正有意义,您可能还希望使用类似->

的结果
ack

答案 2 :(得分:0)

使用快递应用程序将其修复:

client.js


module.exports = async(app) => {
    var socketIo = require('socket.io-client');
    var socket = socketIo('http://localhost:9096');

    await socket.emit('getSchema', (data) => {
         //console.log('getSCHEMA');
    });

    await socket.on('resJson', (response) => {
          app.jsonhandler = response;
    });

};

在启动应用程序之前需要该文件:

var controller = require('./client.js')(app.db.models, app);
controller.write();//method that wil use app.jsonhandler

使用app.jsonhandler

可以从任何地方访问套接字的响应