继续检查: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 获得相同的对象,因此您只在状态变化时发射。
我正在开发一个连接到打印机的 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 获得相同的对象,因此您只在状态变化时发射。