Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 编辑我的HTTP调用以使用套接字(socket.io)通过Angular 2应用程序中的Observable接收数据_Mongodb_Angular_Socket.io - Fatal编程技术网

Mongodb 编辑我的HTTP调用以使用套接字(socket.io)通过Angular 2应用程序中的Observable接收数据

Mongodb 编辑我的HTTP调用以使用套接字(socket.io)通过Angular 2应用程序中的Observable接收数据,mongodb,angular,socket.io,Mongodb,Angular,Socket.io,现在我的Angular 2应用程序中有一个http get调用处理来自api的数据。现在我们通过socket.io切换到使用sockets。我一直在使用observable来获取数据,我知道我可以在使用socket.io sockets时继续这样做。但是我很难弄清楚它到底应该是什么样的——也就是说,我需要如何编辑我的getByCategory函数调用来通过套接字连接接收数据。这就是我的getByCategory函数当前在客户端服务中的样子: private _url: string = '

现在我的Angular 2应用程序中有一个http get调用处理来自api的数据。现在我们通过socket.io切换到使用sockets。我一直在使用observable来获取数据,我知道我可以在使用socket.io sockets时继续这样做。但是我很难弄清楚它到底应该是什么样的——也就是说,我需要如何编辑我的getByCategory函数调用来通过套接字连接接收数据。这就是我的getByCategory函数当前在客户端服务中的样子:

   private _url: string = 'https://api.someurl';

    getByCategory() {
        return this._http.get(this._url)
            .map((response:Response) => response.json())
            .catch(this._errorsHandler);
    }
    _errorsHandler(error: Response) {
        console.error(error);
        return Observable.throw(error || "Server Error");
    }
在服务器端,这就是我的函数导出在mongoDB设置中的样子(已经设置为通过socket.io使用套接字):

我应该如何编辑getByCategory函数以在服务中使用socket.io而不是http?我是否需要来自api的emit函数来在Angular 2服务中执行操作?或者我可以调整当前的getByCategory函数以使用现有observable中的套接字吗

我考虑编辑函数,使其看起来像这样:

    getByStage() {
        this.socket.on('getByCategory')
            .map((response:Response) => response.json())
            .catch(this._errorsHandler);
    }
}

。。。但要做到这一点,我需要服务器函数导出,以便通过“emit”或类似的方式使其可用,不是吗?如果我那样做行吗?我在这里遗漏了什么吗?

如果您需要使用套接字连接(如),您应该依赖回调

因此,您应该设置回调函数来使用它们

这里给出了一个演示-

import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';
import * as io from 'socket.io-client';

export class ChatService {
  private url = 'http://localhost:5000';  
  private socket;

  sendMessage(message){
    this.socket.emit('add-message', message);    
  }

  getMessages() {
    let observable = new Observable(observer => {
      this.socket = io(this.url);
      this.socket.on('message', (data) => {
        observer.next(data);    
      });
      return () => {
        this.socket.disconnect();
      };  
    })     
    return observable;
  }  
}
有关将Angular2与socket.io一起使用的完整教程,请参见


希望你能得到答案。

据我所知,这是不可能的。您应该将套接字对象映射到套接字连接,并设置回调以使用它们。因此,您的意思是在服务器和客户端之间使用“发射”和“打开”之类的方法吗?是的,伙计:)给出了答案,请尝试一下,并让我知道这是否解决了您的问题。谢谢您澄清,这不是真的可以通过其他方式解决的,Abrar。我将调整服务器和客户端以使用“发出”、“打开”和回调。
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';
import * as io from 'socket.io-client';

export class ChatService {
  private url = 'http://localhost:5000';  
  private socket;

  sendMessage(message){
    this.socket.emit('add-message', message);    
  }

  getMessages() {
    let observable = new Observable(observer => {
      this.socket = io(this.url);
      this.socket.on('message', (data) => {
        observer.next(data);    
      });
      return () => {
        this.socket.disconnect();
      };  
    })     
    return observable;
  }  
}