1
votes

Comment appeler une fonction uniquement après avoir terminé l'exécution d'un thread dans angular 5?

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.
  }

3 commentaires

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.


4 Réponses :


1
votes

Essayez de cette façon en utilisant async

this._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();
}

Async


1 commentaires

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.



1
votes

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();
});


2 commentaires

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



1
votes

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


2 commentaires

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



1
votes

change loadListModel en observable:

this._listServiceMod.loadListModel(response).pipe(
  tap(() =>  this.filterList())
).subscribe()


1 commentaires

Essayé mais filterList () est appelé avant même que loadListModel ne démarre l'exécution.