2

en ce moment j'ai un résolveur appeler le service standard et retourner un Observable:attente pour l'état résolveur (NGRX)

return this.someService.getData() 
     .map(data=> data.json()) 

Je veux le remplacer par des effets NGRX et magasin. Lorsque resolver est exécuté, je veux envoyer requestAction intercepté par effet, ce qui rend la requête http. Une fois les données renvoyées, j'envoie dataReceivedAction avec des données en tant que données utiles.

Fondamentalement, je veux envoyer une action résolveur et d'attendre que de nouvelles données sont en partie du magasin. J'essaie de le faire de cette façon:

return Observable.combineLatest(
     Observable.of(
     this.store.dispatch(new requestAction()) 
    ), 
     this.store.select(store => store.dataIWaitFor), 
     (dispatchedAction, dataArrived) => dataArrived 
    ) 
     .skip(1) 

cela ne fonctionne pas, je veux dire le résolveur ne rend pas le composant, mais quand à la fin de chacun de ces retournés Observables ajouter

.do(data => console.log(data)) 

la les mêmes données sont enregistrées. Qu'est-ce que je fais mal?

+0

Je pense NGRX fait automatiquement et attendre observable à résoudre avant de le rendre –

+0

j'ai trouvé la solution ici https://stackoverflow.com/a/45104515/3931068 Observable doit être fini –

Répondre

0

Vous pouvez faire quelque chose comme ça

@Injectable() 
export class SomeGuard implements CanActivate { 
constructor(private store: Store<AppState>) {} 

waitForDataToLoad(): Observable<Something> { 
    return this.store.select(state => state.something) 
     .filter(something => something && !something.empty); 
} 

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> { 
    this.store.dispatch({type: LOAD_something}); 

    return this.waitForDataToLoad() 
     .switchMap(() => { 
      return Observable.of(true); 
     }); 
    } 
} 
}