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

pqwbnv8z  于 2022-12-17  发布在  Java
关注(0)|答案(3)|浏览(168)

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

主文件:

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

显然,receivedSch的值是未定义的。

客户端.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中返回它

hsvhsicv

hsvhsicv1#

您的exports.emitMsg没有做您认为它应该做的事情,这里的async关键字除了返回解析为undefined的承诺之外,什么也不做。
因为socket.emit是一个回调函数,所以需要 Package 成new Promise
那么试试-〉

exports.emitMsg = function() {
  return new Promise((resolve) => {
    socket.emit('getSchema', resolve);
  });
}

为了使ack真正有意义,您可能还需要使用结果,如-〉

let val = await socketclass.emitMsg();
lx0bsm1f

lx0bsm1f2#

通过使用Express应用程序修复了它:

客户端.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,可以在任何地方访问来自套接字的响应

wxclj1h5

wxclj1h53#

请按照以下步骤来实现这一点。
1.在文件中包含const EventEmitter = require('events');
1.在socket.on之前创建事件发射器对象
const myEmitter =新事件发射器();套接字.on(“resJson”,(响应)=〉{导出.接收到的Sch =响应; myEmitter.emit('得到响应',响应);//发射事件(重要)});
1.使用myEmitter对象接收响应。
myEmitter.on('get_response',函数(数据){//console.log(数据); });
也许能帮到你。

相关问题