Angular 6 - невозможно подписаться на данные, возвращенные из сервиса - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь создать простой сервис кеширования в Angular;служба с простой функцией установки / получения, из которой различные компоненты могут извлекать данные.

К сожалению, при подписке на эту службу для получения данных обратный вызов подписки никогда не вызывается и данные не извлекаются.

catch-service.service.js

import { Injectable } from '@angular/core';
import { Observable, from } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class CacheService {

  cacheData: Observable<any>;

  constructor() { }

  setCacheData(data) {
    this.cacheData = new Observable(data)
  }

  getCacheData() :Observable<any> {
    return from(this.cacheData);
  }
}

component.component.js

...
export class SomeComponent {

  constructor(private cacheService: CacheService) { }

  data = null;

  ngOnInit() {
    this.cacheService.getCacheData().subscribe(resp => {
      console.log(resp);
      this.data = resp;
    });
  }
...

У меня естьвнедрил сервис в класс модуля и нет ошибок компиляции.Данные в компоненте просто никогда не устанавливаются.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы можете сделать что-то вроде ниже

   export class CacheService {

     //create a method to set and get the cache 
     cacheData: Observable<any>
     setCache: (cachedata: any) {
          var newObservable = new Observable(observer => {
            observer.next(cachedata);
            observer.complete();
          });
          this.cacheData=newObservable;

    }
    getCacheData() :Observable<any>{
        return this.cacheData;
    }

На свой компонент вы можете подписаться, как показано ниже.

service.getCacheData().susbcribe((data)=>{
    //here you will get
});

Вы также можете проверить ответ ниже, как наблюдаемая работа

Как создать наблюдаемую с параметрами в Angular 6?

0 голосов
/ 30 декабря 2018

Вам нужно предоставить данные в cacheData.

, используйте этот пример.

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs'

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {

  cacheData: Observable<any> = new Observable(observer => {
    observer.next(1)
    observer.next(2)
    observer.next(3)
    observer.next(4)
  })

  ngOnInit() {
    this.cacheData.subscribe(
      (data) => {
        console.log(data)
      }
    )
  }
}

там вы создаете новую Observable из библиотеки ngrx, которая поставляется сangular.

А затем задайте значения, которые вы будете использовать (с observer.next()) после подписки на свойство cacheData.

observer.next() можно получить в качестве аргументов.

  • Булево
  • Число
  • Строка
  • Функция
  • Объект
  • Массив
  • ноль
  • undefined

Для более детального просмотра https://angular -2-training-book.rangle.io / handout / observables / .

...