我正在开发一个与打印机连接的角度应用程序。打印机具有自己的状态服务,这是一个承诺,并以打印机状态作为响应。在我的角度应用程序中,我需要一项功能,需要在后台保持检查打印机状态。为此,我尝试使用观察功能和订阅功能,该功能无法按预期工作。
在我的 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()服务自动查找打印机状态的方式进行此项工作?任何帮助是极大的赞赏。谢谢。
答案 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获取相同的对象,因此仅在状态更改时发出。