继续检查:Angular 可从 Promise 观察到

Keep Checking: Angular Observable from Promise

我正在开发一个连接到打印机的 angular 应用程序。打印机有自己的状态服务,这是一个承诺,它以打印机状态响应。在我的 angular 应用程序中,我需要一个功能,我需要在后台不断检查打印机的状态。为此,我正在尝试使用未按预期工作的可观察和订阅功能。

在我的 PrinterService.ts 组件中,我将函数定义为:

getStatus() {
  return from(cordova.xyz.getPrinterStatus()); // getPrinterStatus() is a promise
}

我在我的 HomePage.ts 中使用这个函数作为:

this.printerService.getStatus().subscribe( (res) => {
  console.log("Printer Status", res);
}

这里的问题是我只收到一次状态响应。例如,如果我的打印机打开,它会给我“打开”状态,但它只在控制台内打印一次。但是当 2-3 分钟后,如果我关闭打印机,它应该给我状态为“关闭”。我如何以我的 getStatus() 服务自动查找打印机状态的方式进行这项工作?任何帮助是极大的赞赏。谢谢

您将需要轮询,因为 promise 只解析一次,请使用计时器

const { timer, of } = rxjs;
const { switchMap, distinctUntilChanged } = rxjs.operators;

const printerService = {
  getStatus: () => of((Math.random() < .5) ? 'off' : 'on')
}

timer(0, 500).pipe(
  switchMap(_ => printerService.getStatus()),
  distinctUntilChanged()
).subscribe(res => {
  console.log("Printer Status", res);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.2/rxjs.umd.min.js"></script>

distinctUntilChanged 意味着 observable 仅在状态更改时发出,而不是每次轮询时发出。

const { timer, of } = rxjs;
const { switchMap, scan, distinctUntilChanged } = rxjs.operators;

const printerService = {
  getStatus: () => of({ status: (Math.random() < .5) ? 'off' : 'on' })
}

timer(0, 500).pipe(
  switchMap(_ => printerService.getStatus()),
  scan((previous, current) => current.status === previous.status ? previous : current),
  distinctUntilChanged()
).subscribe(res => {
  console.log("Printer Status", res);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.2/rxjs.umd.min.js"></script>

如果前一个对象具有相同的状态,您可以使用扫描来发射它,这意味着 distinctUntilChanged 获得相同的对象,因此您只在状态变化时发射。