简体   繁体   English

订阅 observable(作为主题)

[英]subscribe observable (as subject)

i have following example code which returns id+1 of it's elements:我有以下示例代码,它返回它的元素的 id+1:

EntitiesService:实体服务:

  public create(model: Model): Observable<number> {
        var subject = new Subject<number>();
        this.GetAll().subscribe(result => {
            if (result.find(x => x.name == model.name)) {
                return;
            }
            model.id = result[result.length - 1].id + 1;
            EntitiesService.mock.push(model);
            subject.next(model.id);
        })
        return subject.asObservable();
    }

and i would like to subscribe it to get last id:我想订阅它以获取最后一个 ID:

component:零件:

 createMealType(type: string) {
    return this.EntitiesService.create({
      name: type
    }).subscribe((id) => {
      console.log(id);
    })}

but it never goes to console.log while im debugging neither dont do console.log但它永远不会进入console.log,而我正在调试也不做console.log

get all retyurns only of(mock)只获得所有的回报(模拟)

  public GetAll(): Observable<Model[]> {

        return of(EntitiesService.mock);
    }

how should i handle it?我应该如何处理?

I don't see the need for the Subject here.我认为这里不需要Subject You could use the RxJS operators filter and map to accomplish your requirement and return the observable directly from the create() function.您可以使用 RxJS 运算符filtermap来完成您的要求并直接从create()函数返回 observable。

I've also replaced the Array#find with Array#some function.我还用Array#some函数替换了Array#find

import { filter, map } from 'rxjs/operators';

public create(model: Model): Observable<number> {
  return this.GetAll().pipe(
    filter((result: any) => result.some(x => x.name != model.name)),
    map((result: any) => {
      model.id = result[result.length - 1].id + 1;
      EntitiesService.mock.push(model);
      return model.id;
    })
  );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM