Angular / Метод преобразования машинописного текста с обещанием в наблюдаемый - PullRequest
0 голосов
/ 17 июня 2020

У меня есть метод, который работает как задумано:

getdata(): Promise<any> {
    let query = `SELECT * FROM table`;
    return new Promise((resolve, reject) => {
      this.db.query(query, (error, rows) => {
        if(error) reject(error);
        resolve(rows);
      });
    });
}

ngOnInit() {
    this.myservice.getdata().then(result => {
      this.data = result;
    })
}

Я использую Angular 9 / Electron

Как я могу изменить его, чтобы он работал как Observable?

Ответы [ 4 ]

3 голосов
/ 17 июня 2020

вы можете просто обернуть любое обещание в from, чтобы преобразовать его в наблюдаемое:

getdata(): Observable<any> {
    let query = `SELECT * FROM table`;
    return from(new Promise((resolve, reject) => {
      this.db.query(query, (error, rows) => {
        if(error) reject(error);
        resolve(rows);
      });
    }));
}

, или вы можете пропустить обещание и go вперед и создать наблюдаемое напрямую:

getdata(): Observable<any> {
    let query = `SELECT * FROM table`;
    return new Observable((obs) => {
      this.db.query(query, (error, rows) => {
        if (error) {
          obs.error(error);
        } else {
          obs.next(rows);
          obs.complete();
        }
      });
    });
}
1 голос
/ 17 июня 2020

Правильнее всего использовать bindNodeCallback

getdata(): Promise<any> {
  return bindNodeCallback(this.db.query)(`SELECT * FROM table`);
}

ngOnInit() {
  this.myservice.getdata().subscribe(result => {
    this.data = result;
  });
}
1 голос
/ 17 июня 2020

Преобразование функции с обратным вызовом, первым параметром которого является error («Node.js -стайл обратного вызова»), в Observable лучше всего выполнять с помощью bindNodeCallback:

getdata(): Observable<any> {
  const query = `SELECT * FROM table`;
  return bindNodeCallback(this.db.query)(query)
}

// subscribing:
ngOnInit() {
  this.myservice.getdata().subscribe(result => {
    this.data = result;
  });
}

Ссылка

1 голос
/ 17 июня 2020

Вы можете попытаться вернуть Rx JS Subject наблюдаемое.

completed$ = new Subject<any>();

getdata(): Observable<any> {
  const result = new BehaviorSubject<any>(null);
  const query = `SELECT * FROM table`;
  this.db.query(query, (error, rows) => {
    error ? result.error(error) : result.next(rows);
  });
  return result.asObservable();
}

ngOnInit() {
  this.myservice.getdata().pipe(
    takeUntil(this.completed$)
  ).subscribe(
    rows => {
      if (rows) {          // <-- check if response is valid
        this.data = rows;
      } 
    },
    error => { }
  );
}

ngOnDestroy() {
  this.completed$.next();
  this.completed$.complete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...