Javascript 如何在8上处理从service.ts到component.ts的socket.io确认

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如果我可以添加

当客户端使用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如果有帮助,请将答案标记为解决方案