不断检查:可以从承诺中观察到角度

时间:2020-08-17 00:38:58

标签: angular rxjs observable angular-promise

我正在开发一个与打印机连接的角度应用程序。打印机具有自己的状态服务,这是一个承诺,并以打印机状态作为响应。在我的角度应用程序中,我需要一项功能,需要在后台保持检查打印机状态。为此,我尝试使用观察功能和订阅功能,该功能无法按预期工作。

在我的 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()服务自动查找打印机状态的方式进行此项工作?任何帮助是极大的赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

您将需要轮询,因为承诺只能解决一次,请使用计时器

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表示可观察对象仅在状态更改时发出,而不是在每次轮询时发出。

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>

如果状态相同,则可以使用scan发出前一个对象,这意味着distingtUntilChanged获取相同的对象,因此仅在状态更改时发出。