Say I ont une composante angulaire 2 comme ceci:RxJS abonnements multiples à boutons alloués dynamiquement
import { Component, AfterViewInit, ViewChildren, QueryList, ElementRef } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import {ApiService} from './my.service'
@Component({
selector: 'my-component',
template: `
<div class='button0' [ngClass]="{selected: selection === 0}" #button>Hello World</div>
<div class='button1' [ngClass]="{selected: selection === 1}" #button>Hello World</div>
`,
styles: [`
.selected {
color: red;
}
`],
providers: [ApiService]
})
export class MyComponent implements AfterViewInit {
selection = 0;
@ViewChildren('button') buttons: QueryList<ElementRef>;
buttonObservables:any[] = null;
constructor(private api: ApiService) {}
updateServer(index) {
api.requestsExample(index)
.then((result) => {
//update other divs and stuff
}
}
updateColor(index) {
this.selection = index;
}
ngAfterViewInit() {
this.buttonObservables = this.buttons.map((button) => Observable
.fromEvent<MouseEvent>(button.nativeElement, 'click'));
this.buttonObservables.map((observable) => {
observable.throttleTime(2000).subscribe((event:MouseEvent) => {
const element:Element = event.target as Element;
this.updateServer(element.classList[1].match(/\d+/g));
})
});
this.buttonObservables.map((observable) => {
observable.subscribe((event:MouseEvent) => {
const element:Element = event.target as Element;
this.updateColor(element.classList[1].match(/\d+/g));
})
});
}
}
où ApiService.requestsExample
est une fonction annotée asynchrone qui en fait la demande et renvoie une réponse.
Le code à peu près œuvres (par exemple, les demandes sont étranglées, bouton empâtage ne donne pas trop de demandes, les couleurs changent encore)
Je me bats pour comprendre pour gérer la EdgeCase suivante: 1) Je Comme pour garantir que le résultat qui a été tiré en dernier est celui dont la réponse est acceptée (en supposant que la réponse revienne), et ensuite travailler dans l'ordre chronologique. Je ne suis pas sûr de savoir comment y parvenir en raison du fait que les demandes sont asynchrones? 2) (corollaire) Afin d'éviter les scintillements lors de la mise à jour, je souhaite également annuler tous les résultats renvoyés par le serveur lorsqu'un résultat ultérieur revient (en fonction de l'ordre des problèmes plutôt que de l'ordre de réponse). 3) Une fois la dernière requête live en cours renvoyée, je voudrais abandonner toutes les observables en cours, car je ne m'en soucie plus. Donc, en gros, si un utilisateur écrase les deux boutons pendant 20 secondes, je m'attendrais à faire 10 requêtes, mais à l'exception de changer les couleurs des boutons, mettre à jour l'interface utilisateur une fois, et à la bonne valeur.
De plus je voudrais juste aimer des commentaires s'il y a une meilleure façon de parvenir à ce résultat avec Observables (ou même si observables sont l'outil pour ce travail!)
C'est incroyable! Je vous remercie :) –