Angular 2 - ожидание получения информации от службы - возврат обещания при установке переменной - PullRequest
0 голосов
/ 14 июня 2019

основной app.component запрашивает данные из веб-службы

затем он устанавливает переменную в службе с именем coreService , которая везде вводится для доступа к этим данным

проблема в том, что другие компоненты загружаются до того, как app.component получает информацию, поэтому я получаю тонны неопределенных проблем

  • Я не получаю данные из coreService, в противном случае веб-сервис вызывается несколько раз (пытался использовать условие и pipe (), но он не работает)

  • Я пытался использовать AfterViewInit, но он работает с перебоями

app.component:

ngOnInit() {
    this.catalogService.getCampaign().then((data: any) =>
    {
        this.coreService.campaign=data;
    });
}

products.component: (компонент загружен в роутер-розетку)

constructor(private coreService:CoreService)
{}

ngAfterViewInit()
{
    Promise.resolve(null).then(() => {   // to avoid value changed error b@#!t from angular
        if(this.coreService.campaign)
        {
                        ... // we should be here                
        }
        else
        {
            console.dir(this.coreService);
            throw "campaign not loaded yet";
        }
    });
}

Я хочу, чтобы эти два компонента были синхронизированы, я имею в виду, что компонент products должен ждать, пока coreService получит свои данные

это не определено в цепочке:

@Injectable({
  providedIn: 'root'
})
export class AppResolver implements Resolve<boolean> {

  constructor(private catalogService: CatalogService, private coreService:CoreService) { }

  public resolve(route: ActivatedRouteSnapshot): Promise<boolean> 
  {
    return this.catalogService.getCampaign(CoreService.CAMPAIGN_IDENTIFIER,null).then((data: any) => 
    {
        this.coreService.campaign=data;
        return true;
    })
    .then(function(result) : Promise<boolean>
    {
        // below this is undefined and throws an error
        //////////////////////////////////////////////
        return this.catalogService.getCampaign(CoreService.CAMPAIGN_IDENTIFIER,null).then((data: any) => {
            this.coreService.campaign=data;
            return true;
        });
    });
  }
}

1 Ответ

1 голос
/ 14 июня 2019

Вы должны получить данные в Resolver .

@Injectable({
  providedIn: 'root'
})
export class MyDataResolverService implements Resolve<boolean> {

  constructor(private catalogService: CatalogService, private coreService:CoreService) { }

  public resolve(): Promise<boolean> {
    return this.catalogService.getCampaign().then((data: any) => {
        this.coreService.campaign=data;
        return true;
    });
  }
}

, а затем использовать преобразователь в конфигурации вашего маршрута

...
  {
    path: '',
    component: AppComponent,
    resolve: {
      dataResolved: MyDataResolverService
    }
  }
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...