Javascript,异步问题所需的解决方案

标签 javascript angular typescript asynchronous es6-promise

目前正在使用 Angular、socket.io 和 express 创建一个应用程序。但是,我遇到了一个异步问题,我很难找到解决方案。这是代码:

  export class WebsocketService {

  this.socket;

  public connect() {
    const token = sessionStorage.getItem('token');
    this.socket = io('http://localhost:3000', { query: { token: token } });
  }

  public getSocket () {

      // this function should only return this.socket when it is available

      return this.socket;

  }

这个想法是,首先在应用程序的某处某处与 websocket 连接一次,因此调用 io 函数一次:

    this.socket = io('http://localhost:3000', { query: { token: token } });

然后在应用程序的其余部分,应该传递 this.socket 属性。但是,this.socket 应该始终返回该对象,如果它不存在则应该等待它。

实现还应处理应用程序的其他部分,这些部分尝试调用 getSocket 并返回未定义。基本上,getSocket 不应该返回 undefined 它应该等待连接然后返回 this.socket

我试着玩弄了一些 promises,但我似乎找不到一个优雅的解决方案。

最佳答案

我不知道你为什么需要 connect 方法,但这是一种方法

export class WebsocketService {

  getSocket() {

    // this function should only return this.socket when it is available

    if (!this.socket || (this.socket && this.socket.disconnected)) {

      this.socket = new Promise((resolve, reject) => {

        const token = sessionStorage.getItem('token');
        const s = io('http://localhost:3000', { query: { token: token } });

        s.on('connect', () => {
          console.log(socket.connected); // true
          resolve(s);
        });

        s.on('disconnect', () => {
          console.log(socket.disconnect); // true
          reject(s);
        });
      });
    }

    return this.socket;
  }
}

那么,用法是:

service.getSocket().then(socket => {
    // Use the socket
});

或者使用异步/等待:

const socket = await service.getSocket();
// Use the socket

关于Javascript,异步问题所需的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51728996/

相关文章:

javascript 相当于 python 的编译和执行

angular - 在http observable开始网络调用之前执行代码

reactjs - React + Typescript - 引用输入错误

typescript - DefinitelyTyped log4javascript 缺少模块声明

javascript - 无法读取未定义的 angular2 的属性 'version'

javascript - 基于JSON对象动态创建表单

javascript - ReactJS:比较 shouldComponentUpdate 上的 Prop 和状态

javascript - 在 Maven 生命周期中运行 JavaScript 文件

javascript - 如何在jade中进行嵌套迭代?

angular - 如何在 ANGULAR 2 中提交表单时重置表单验证