Angular5 - Поведение субъекта, приводящее к неопределенному - PullRequest
0 голосов
/ 30 мая 2018

У меня много ссылок Rxjs и ссылок на стек-потоки, но я не могу понять это

У меня есть http.get (), определенный в сервисе.Я пытаюсь изобразить наблюдаемый ответ в теме «Поведение», а затем подписаться на него (поскольку у субъекта поведения есть преимущества, связанные с последним выводом потока данных, которому я верю).Вот код службы и компонента

SearchService.ts

import { ReplaySubject } from 'rxjs/Rx';
import { error } from 'util';
import { Subject } from 'rxjs/Subject';

import { Response } from '@angular/http';

import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import {Promotion} from './dto/promo.dto';
import { List } from 'immutable';
import {map, filter, reduce, switchMap, tap} from 'rxjs/operators';


@Injectable()
export class SearchService {
   getUrl: String = './../assets/promotionList.json';
   subject: BehaviorSubject<Promotion[]> ; 
   subjectAsObservable;
   stringify  = require('json-stringify-safe');

   someResult;
   constructor(private http: HttpClient) {
   this.subject = new BehaviorSubject<Promotion[]>([]);

   }
    getNextObservable():Observable<Promotion[]>{
      return this.subject.asObservable(); 
    }
    setValueInSubject(){
       this.getPromoList().subscribe(data => {
       this.someResult = data;
       console.log('getting some result', this.someResult);
      });
  this.subject.next(this.someResult);
}


getPromoList(): Observable<Promotion[]>{

  return this.http.get(`${this.getUrl}`).map(data => {
    console.log('raw data', data);

    this.someResult = data;
    console.log('someresults in first method', this.someResult);
    return this.someResult;
    // now the response returned is the actual Promotion response
  });

 }
}

SearchPromoComponent.ts

import { NgxLoggerLevel } from 'ngx-logger';
import { retry } from 'rxjs/operator/retry';
import { Subject } from 'rxjs/Subject';
import { ActivatedRoute } from '@angular/router';
import { setTimeout } from 'timers';


import { Response } from '@angular/http';

import { FormBuilder, FormGroup, FormControl, Validators, 
ReactiveFormsModule } from '@angular/forms';

import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
import { debounceTime, filter, flatMap, map, switchMap, tap } from 
'rxjs/operators';

import { Promotion } from './../dto/promo.dto';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { SearchService } from './../search.service';
import { AfterViewChecked, AfterViewInit, Component, OnDestroy, OnInit 
 } from '@angular/core';
import { NGXLogger } from 'ngx-logger';

@Component({
  selector: 'app-search-promo',
  templateUrl: './search-promo.component.html',
  styleUrls: ['./search-promo.component.css']
})
export class SearchPromoComponent implements  OnInit{
  searchGroup: FormGroup;
  stringify  =  require('json-stringify-safe');
  someResult: any;
  promoList: Promotion[];
  subsc: Subscription;
   subValue;
  localInput = new FormControl('', Validators.required);
       consumedPromoList: Observable<Promotion[]>;
       loading: Boolean = false;


  compSubscription: Subscription;
  // Use activated route to get the data from
  constructor(private searchService: SearchService, fb: FormBuilder,
     private paramConfig: ActivatedRoute,
     private logger: NGXLogger,
     private subjectPromoService: SubjectPromoService
  ) {
     this.searchGroup = fb.group({
  'localInput': this.localInput
  });

   }

    ngOnInit(){

       // inorder for the subject subscription to work
       // call like this

       this.searchService.setValueInSubject();

       this.subsc = 
       this.searchService.getNextObservable().subscribe(data => 
       console.log('in comp', data));
     }

 }

Регистратор in comp всегда имеет неопределенное значение и фактически является httpСервис возвращает значения, использованные после in comp

Не могли бы вы помочь мне выяснить, как получить значение http, испускаемое субъектом поведения

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

К вашим услугам переместите this.subject.next внутрь subscribe и component subscribe к этому subject

Служба:

  setValueInSubject(){
       this.getPromoList().subscribe(data => {
        this.someResult = data;
        console.log('getting some result', this.someResult);
        this.subject.next(this.someResult);
      });
  }

В вашем компоненте:

 ngOnInit(){

   this.searchService.setValueInSubject();
   this.subsc = 
   this.searchService.subject.subscribe(data => 
   console.log('in comp', data)
   );
 }
0 голосов
/ 30 мая 2018

Пожалуйста, эмитируйте по подписке.this.someResult может быть недоступно при отправке.

setValueInSubject(){
   this.getPromoList().subscribe(data => {
       this.someResult = data;
       console.log('getting some result', this.someResult);
       this.subject.next(this.someResult);
  });
}

В вашей реализации это Behavior Subject, поэтому при вашем следующем запросе get я считаю, что вы должны получить данные из предыдущего запроса, если толькоthis.someResult сбрасывается в любом месте, кроме подписки.

...