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.loadListModelVous pouvez utiliser la fonction
setTimeoutsi votre modèle est simple.