Search code examples
angularangular2-routing

Executing resolvers one after the other in Angular 2+


Given the following route:

path: '',
component: MyComponent,
resolve: {
    foo: FooResolver,
    bar: BarResolver
}

Is there any way of telling angular to execute the first resolver FooResolver, and only execute the second resolver BarResolver once the first one has finished?


Solution

  • Resolvers are resolved in parallel. If Foo and Bar are supposed to be resolved in series they should be a single FooBar resolver. If they are supposed to be used by themselves in other routes, FooBar can wrap Foo and Bar resolvers:

    class FooBarResolver implements Resolve<{ foo: any, bar: any }> {
      constructor(
        protected fooResolver: FooResolver,
        protected barResolver: BarResolver
      ) {}
    
      async resolve(route): Promise<{ foo: any, bar: any }> {
        const foo = await this.fooResolver.resolve(route);
        const bar = await this.barResolver.resolve(route);
    
        return { foo, bar };
      }
    }
    

    FooBar should be aware of the fact if it is a promise or an observable that is returned from Foo and Bar in order to resolve them properly. Otherwise additional safety device should be added, like await Observable.from(this.fooResolver.resolve(route)).toPromise().

    FooBar and Foo or Bar shouldn't appear within same route because this will result in duplicate resolutions.