J'essaye d'appeler une fonction après un thread. Mais la fonction est être appelé avant de terminer le fil. Où dois-je changer?
this._listService.getListById(this.userName) .subscribe((response: any) => { // getting proper response. if (response) { this._listServiceMod.loadListModel(response); // thread this.filterList(); } }); loadListModel(data:any) { const promise = this._listItemService.run( this.loadListItem, { constants: appConstants }); promise.then((updatedAuthList) => { .... .... this._listItemService.terminate(promise); }).catch(e => { });; } filterList(){ console.log('Inside Filter List') // prints before completing thread. }
4 Réponses :
Essayez de cette façon en utilisant asyncthis._listService.getListById(this.userName)
.subscribe((response: any) => {
if (response) {
this.modelOpen(response);
}
});
filterList(){
console.log('Inside Filter List')
}
async modelOpen(response) {
await this._listServiceMod.loadListModel(response);
this.filterList();
}
J'ai essayé de cette façon. Mais le résultat est toujours le même. En mode débogueur, il est identifié que le filterList () est appelé avant de terminer la promesse.
Si filterList
ne dépend pas de la sortie des méthodes précédentes, vous pouvez utiliser les mergeMap pour gérer cette situation.
this._listService.getListById(this.userName).pipe( mergeMap(response => this._listServiceMod.loadListModel(response)) ).subscribe(response => { this.filterList(); });
filterList
se déclenche toujours avant loadListModel ()
?
Que diriez-vous de l'utiliser? rxjs-dev.firebaseapp.com/api/operators/skipUntil Si vous avez besoin , peut écrire un échantillon une fois à la maison
Modifiez votre méthode loadListModel
en suivant.
this._listService.getListById(this.userName) .pipe( mergeMap(response => { if(response) { // Getting the promise let promise = this._listServiceMod.loadListModel(response); // Converting the promise to an observable by using rxjs's from return from(promise); } else { return false; } ) ) .subscribe((res) => { // Finally call the filterList if(res) this.filterList(); });
Vous pouvez maintenant convertir la promesse renvoyée en observable et utiliser mergeMap
dans rxjs pour combiner deux observables
loadListModel(data:any): Promise<any> { let promise = this._listItemService.run( this.loadListItem, { constants: appConstants }) return promise.then((updatedAuthList)=> { this._listItemService.terminate(promise); return true; }); }
Vérifiez ce fonctionnement stackblitz
Je ne peux pas changer la méthode loadListModel car elle est également utilisée par d'autres composants.
Vous pouvez créer une méthode loadListModel
en double pour cela
change loadListModel en observable:
this._listServiceMod.loadListModel(response).pipe( tap(() => this.filterList()) ).subscribe()
Essayé mais filterList () est appelé avant même que loadListModel ne démarre l'exécution.
Pouvez-vous montrer l'implémentation de
loadListModel ()
?Que renvoie le
this._listServiceMod.loadListModel
Vous pouvez utiliser la fonction
setTimeout
si votre modèle est simple.