从同步方法发送 websocket 消息,并以相同的方法 return 发送数据

Send a websocket message from a sync method and return the data in same method

我正在做一个 angular 项目,想知道实现以下内容的最佳方法。

Requirement is: To get image from cache if available otherwise get the image from web socket server.

我可以使用以下代码片段完成此操作。

import { Observable,Observer, Subject } from 'rxjs/Rx';
import { webSocket } from 'rxjs/webSocket'

.....

if(key in localStorage)
{
  result = localStorage.getItem(key);
}
else{
    this.websocketClient = 
<Subject<Message>>this.imgWebSocketService.connect();
    this.websocketClient.subscribe(
      (msg) => this.onMessageReceived(msg),
      (err) => this.onError(err),
      () => console.log('complete')
    );
    this.websocketClient.next(message);
}

现在我试图在一个名为 ImageCacheService 的单独服务中编写它,并添加一个方法来从缓存或服务器中检索图像。因此,为此,我坚持不懈,想获得有关 Angular 6.

中最佳方法的建议

我需要的是像 getImage(request:Message) 这样的函数,它将执行这些操作和 return 图像数据。

 getImage(request:Message,useCache:boolean):any{
    var result = null;
    if(key in localStorage){
       result = localStorage.getItem(key);
    }
    else{
       this.websocketClient.subscribe(
           (msg) =>  result = msg,
           (err) => this.onError(err),
           () => console.log('complete')
       );
       this.websocketClient.next(message);
    }
    return result;
 }

但是由于消息是以异步方式接收的,我知道上面的代码不会按预期工作。我知道写一个回调可以解决这个问题,但我正在寻找任何其他更好的方法来实现这个。

所以任何人都可以让我知道如何以最好的方式做到这一点 angular/typescript。

我可以找到解决方案。 这是工作代码。

getImage(key:any):Promise<any>{
    var promise = new Promise((resolve, reject) => {
      if(key in localStorage){
        var objectFromCache = JSON.parse(localStorage.getItem(key));
        resolve(objectFromCache);
      }
      else{        
        this.websocketClient.subscribe(
          (msg) => {            
            this.setImageToCache(key,msg)
            resolve(msg)
          },
          (err) => reject(err),
          () => console.log('complete')
        );
        this.websocketClient.next(request);
      }      
    });
    return promise;
}

下面是我使用这个方法的方法。

this.imgCacheManagerService.getImage(msgToSend).then(
  (img) => {        
    this.imageData = img.Image;      
  },
  () => console.log("Error Occurs!"),
);