Javascript 如何在8上处理从service.ts到component.ts的socket.io确认
当客户端使用socket.io向服务器发送新消息时,服务器将通过回调fn()发送对新创建的messageId的确认。我能够在service.ts中记录messageId,但无法找到将messageId“获取”到component.ts的方法(以便用ID更新新创建的消息)。按照下面的代码设置方式,我得到一个角度错误,表示我无法订阅此.appService.newMessage(),即使我在service.ts中返回了一个新消息id的可观察值,其中包含of(newMsgId)。请lmk如果我可以添加任何更多的信息来帮助Javascript 如何在8上处理从service.ts到component.ts的socket.io确认,javascript,node.js,angular,socket.io,mean-stack,Javascript,Node.js,Angular,Socket.io,Mean Stack,当客户端使用socket.io向服务器发送新消息时,服务器将通过回调fn()发送对新创建的messageId的确认。我能够在service.ts中记录messageId,但无法找到将messageId“获取”到component.ts的方法(以便用ID更新新创建的消息)。按照下面的代码设置方式,我得到一个角度错误,表示我无法订阅此.appService.newMessage(),即使我在service.ts中返回了一个新消息id的可观察值,其中包含of(newMsgId)。请lmk如果我可以添加
server.js
--------
socket.on('newStaffMessage', function (data, fn) {
var msg = new Message({
sender: data.senderId,
content: { text: data.content.text, attachment: null },
dateTime: new Date(),
});
msg.save((err, messageDoc) => {
Conversation.findByIdAndUpdate(
{ _id: data.conversationId },
{
$push: { messages: messageDoc._id },
},
{ new: true },
function (err, convoDoc) {
if (!err) {
User.findById(data.senderId, function (err, userDoc) {
const payload = {
conversationId: convoDoc._id,
_id: messageDoc._id,
content: {
text: msg.content.text,
attachment: msg.content.attachment,
},
dateTime: msg.dateTime,
sender: {
_id: userDoc._id,
firstName: userDoc.firstName,
lastNameInitial: userDoc.lastNameInitial,
},
};
io.in(convoDoc._id).emit('newStaffMessage', payload);
fn({messageId: messageDoc._id});
});
} else {
console.log(err);
}
}
);
});
});
您应该正确地将带有回调的处理socket.io事件转换为可观察的
我建议您有两种选择:
1) 利用可观察的
构造函数或创建
运算符,使用给定的订阅函数:
import { Observable } from 'rxjs';
...
newMessage(msg) {
return Observable.create(observer => {
this.socket.emit('newStaffMessage', msg, (newMsgId) => {
observer.next(newMsgId);
});
});
}
import { bindCallback } from 'rxjs';
newMessage(msg) {
return bindCallback(this.socket.emit)('newStaffMessage', msg);
}
2) 使用专用于此目的的RxJS功能:
import { Observable } from 'rxjs';
...
newMessage(msg) {
return Observable.create(observer => {
this.socket.emit('newStaffMessage', msg, (newMsgId) => {
observer.next(newMsgId);
});
});
}
import { bindCallback } from 'rxjs';
newMessage(msg) {
return bindCallback(this.socket.emit)('newStaffMessage', msg);
}
您应该正确地将带有回调的处理socket.io事件转换为可观察的
我建议您有两种选择:
1) 利用可观察的
构造函数或创建
运算符,使用给定的订阅函数:
import { Observable } from 'rxjs';
...
newMessage(msg) {
return Observable.create(observer => {
this.socket.emit('newStaffMessage', msg, (newMsgId) => {
observer.next(newMsgId);
});
});
}
import { bindCallback } from 'rxjs';
newMessage(msg) {
return bindCallback(this.socket.emit)('newStaffMessage', msg);
}
2) 使用专用于此目的的RxJS功能:
import { Observable } from 'rxjs';
...
newMessage(msg) {
return Observable.create(observer => {
this.socket.emit('newStaffMessage', msg, (newMsgId) => {
observer.next(newMsgId);
});
});
}
import { bindCallback } from 'rxjs';
newMessage(msg) {
return bindCallback(this.socket.emit)('newStaffMessage', msg);
}
#我成功了!我使用它来处理“socket.on”事件,但不是为了发出-感谢快速响应:)@saltrst如果它帮助了\1工作,请将答案标记为解决方案!我用它来处理“socket.on”事件,但不是为了emit-感谢您的快速响应:)@saltrst如果有帮助,请将答案标记为解决方案