Создать Angular наблюдаемый на forEach - PullRequest
0 голосов
/ 11 октября 2019

У меня есть оператор forEach на Angular как часть службы

doSomethingService(someString: string) {

myarray.forEach(element => {
  if (element.Name === someString) {
    if (element.Visible === true) {
      element.Visible = false;
    } else {
      element.Visible = true;
    }
  }

});

}

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

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Оберните ваши данные myarray в Observable, тогда вы сможете использовать все Реактивное программирование RxJS с использованием функции pipe, Операторы Как карта, фильтр, swichMap, ... и т. д.

myObservable: Observable<Element[]>;
  constructor() {
    this.myObservable = this.doSomethingService("Khaled");

    // usage
    this.myObservable.subscribe(elements => {
      console.log(elements); // print elements
    });
  }

  doSomethingService(someString: string): Observable<Element[]> {
    return of(this.fetchMyData()).pipe(
      map(elements => {
        elements.forEach(element => {
          if (element.name === someString) {
            if (element.visible === true) {
              element.visible = false;
            } else {
              element.visible = true;
            }
          }
        });
        return elements;
      })
    );
  }

  fetchMyData(): Element[] {
    return [{ name: "Khaled" }, { name: "Ahmed" }];
  }
0 голосов
/ 12 октября 2019

Используйте оператор 'of' из rxjs, чтобы вернуть Observable, а затем вы можете подписаться на него. Ниже приведен пример кода

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'practice';
  myarray: Sample[];

  doSomethingService(someString: string) {
    this.myarray.forEach(element => {
      if (element.name === someString) {
        if (element.visible === true) {
          element.visible = false;
        } else {
          element.visible = true;
        }
      }
    });
    return of(this.myarray);
  }
  ngOnInit(): void {
    this.myarray = [
      { name: 'foo', visible: false },
      { name: 'boo', visible: false }
    ];
    this.doSomethingService('foo').subscribe(val => {
      console.log(val);
    });
  }
}
export interface Sample {
  name: string;
  visible: boolean;
}
...