que hacer forkjoin ejemplo como typescript promise angular observable rxjs

typescript - hacer - ¿Cómo crear un Observable a partir de datos estáticos similares a http one en Angular?



rxjs (5)

A partir de julio de 2018 y el lanzamiento de RxJS 6 , la nueva forma de obtener un Observable de un valor es importar el operador de la siguiente manera:

import { of } from ''rxjs'';

y luego crea el observable a partir del valor, así:

of(someValue);

Tenga en cuenta que solía tener que hacer Observable.of(someValue) como en la respuesta actualmente aceptada. Hay un buen artículo sobre los otros cambios de RxJS 6 here .

Estoy teniendo un servicio que tiene este método:

export class TestModelService { public testModel: TestModel; constructor( @Inject(Http) public http: Http) { } public fetchModel(uuid: string = undefined): Observable<string> { if(!uuid) { //return Observable of JSON.stringify(new TestModel()); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } } }

en el constructor del componente me estoy suscribiendo así:

export class MyComponent { testModel: TestModel; testModelService: TestModelService; constructor(@Inject(TestModelService) testModelService) { this.testModelService = testModelService; testService.fetchModel("29f4fddc-155a-4f26-9db6-5a431ecd5d44").subscribe( data => { this.testModel = FactModel.fromJson(JSON.parse(data)); }, err => console.log(err) ); } }

Esto funciona si un objeto proviene del servidor pero estoy tratando de crear un observable que funcione con la llamada subscribe() dada para una cadena estática (esto sucede cuando testModelService.fetchModel() no recibe un uuid), por lo que no hay problemas manejo en ambos casos.


Así es como puede crear un observable simple para datos estáticos.

let observable = Observable.create(observer => { setTimeout(() => { let users = [ {username:"balwant.padwal",city:"pune"}, {username:"test",city:"mumbai"}] observer.next(users); // This method same as resolve() method from Angular 1 console.log("am done"); observer.complete();//to show we are done with our processing // observer.error(new Error("error message")); }, 2000); }) to subscribe to it is very easy observable.subscribe((data)=>{ console.log(data); // users array display });

Espero que esta respuesta sea útil. Podemos usar llamadas HTTP en lugar de datos estáticos.


De esta manera puede crear Observable a partir de datos, en mi caso necesito mantener el carrito de compras:

service.ts

export class OrderService { cartItems: BehaviorSubject<Array<any>> = new BehaviorSubject([]); cartItems$ = this.cartItems.asObservable(); // I need to maintain cart, so add items in cart addCartData(data) { const currentValue = this.cartItems.value; // get current items in cart const updatedValue = [...currentValue, data]; // push new item in cart if(updatedValue.length) { this.cartItems.next(updatedValue); // notify to all subscribers } } }

Component.ts

export class CartViewComponent implements OnInit { cartProductList: any = []; constructor( private order: OrderService ) { } ngOnInit() { this.order.cartItems$.subscribe(items => { this.cartProductList = items; }); } }


Las cosas parecen haber cambiado desde Angular 2.0.0

import { Observable } from ''rxjs/Observable''; import { Subscriber } from ''rxjs/Subscriber''; // ... public fetchModel(uuid: string = undefined): Observable<string> { if(!uuid) { return new Observable<TestModel>((subscriber: Subscriber<TestModel>) => subscriber.next(new TestModel())).map(o => JSON.stringify(o)); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } }

Se .next() función .next() en su suscriptor.


Tal vez podría intentar usar el método of de la clase Observable :

import { Observable } from ''rxjs/Observable''; import ''rxjs/add/observable/of''; public fetchModel(uuid: string = undefined): Observable<string> { if(!uuid) { return Observable.of(new TestModel()).map(o => JSON.stringify(o)); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } }