私はあなたのHTTP要求を行うために別のサービスを作成します。
@Injectable()
export class RandomService {
constructor(http: HttpClient) { }
getRandom() {
return this.http.get('http://mywebserver.com/apps/random.php');
}
}
今、あなたは、単にsetInterval
の内側randomService.getRandom()
を呼び出すことができますが、あなたはまた、処理するために(例えばObservable.interval
がある)観察可能な操作を使用することができますこのionViewDidLoad
であなたのために:
async function ionViewDidLoad() {
let loader = this.LoadingController.create({
content: 'Please Wait',
});
await loader.present();
// x number of seconds
this.interval$ = interval(x).pipe(
// make first request right away; otherwise we have to wait x seconds before first one
startWith(),
// cancel previous request if it had not finished yet
switchMap(() =>
// catch the error inside to allow for a retry each time
// you could also use `.catch` on the entire observable stream which will
// cancel it if there's an error.
this.randomService.getRandom().catch(err => {
console.error(err);
this.alertCtrl
.create({
title: 'Error!',
subTitle: 'Please check your Internet Connectivity',
buttons: ['OK'],
})
.present();
}),
),
);
this.interval$.subscribe(data => this.fact = data);
// Separate observable to dismiss loader on first emission
this.interval$.pipe(first()).subscribe(() => loader.dismiss());
}
ionViewWillUnload() {
this.interval$.unsubscribe();
}
注:これは仮定RxJS 5.5を使用するとHttpClient
との角度です。あなたはこれらを持っていないかもしれませんが、あなたはまだ非常に似たようなことをすることができます。あなたはlettable演算子でパイプすることができないでしょう。もしあなたがHttpClient
を使用していないのであれば、私はこのサービスでやる.map(data => data.json())
をやる必要があります。
最後に、可能であれば、this.interval$
のように、保存したり手動でサブスクライブしないようにしてください。代わりにthis.fact$ = interval(x)...
のようなことをする可能性があります。テンプレートで*ngFor="let fact of (fact$ | async)"
を行うことができ、手動で登録を解除する必要はありません。
データを更新するたびにローダーを表示しますか? –
いいえ、私はしたくない – user6579134