Отправьте сообщение websocket из метода синхронизации и верните данные тем же методом - PullRequest
0 голосов
/ 22 января 2019

Я работаю над угловым проектом и хотел бы узнать лучший подход для реализации следующего.

Требование: получить изображение из кэша, если доступно, в противном случае получить изображение с сервера веб-сокетов.

Я могу сделать это, используя приведенный ниже фрагмент кода.

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), которая будет выполнять эти операции и возвращать данные изображения.

 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;
 }

Но поскольку сообщение получено асинхронно, я понимаю, что приведенный выше код не будет работать должным образом. Я знаю, что написание обратного вызова может решить эту проблему, но я ищу другой лучший способ добиться этого.

Так может кто-нибудь, пожалуйста, дайте мне знать, как это сделать наилучшим из возможных угловым / машинописным способом.

1 Ответ

0 голосов
/ 23 января 2019

Я могу найти решение для этого. Вот рабочий код.

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!"),
);
...