我正在尝试在事件发出后使用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
内返回它
答案 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