.then вызывается до того, как асинхронная функция возвращает значение - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь получить authConfig из конечной точки API.Внутри моего компонента приложения я запрашиваю функцию у службы.

this.userDetailService.getAuthConfig().then(config => {
      this.oauthService.configure(config);
      this.oauthService.initAuthorizationCodeFlow();
    }); 

Затем в моей службе настраиваются настройки аутентификации и возвращаются компоненту приложения.Я использую .then на getAuthConfig, поэтому объект конфигурации существует, когда мне нужно настроить oauthService.Когда я отлаживаю его, я вижу, что .configure вызывается с пустым объектом.Почему вызывается configure, прежде чем getAuthConfig возвращает vaule?

 getEnvs(): Promise<any> {
      return this.http.get('/backend').toPromise();
    }

 async getAuthConfig(): Promise<any> {
      this.getEnvs().then((data) => {
        const env = data.env;
        const authConfig: AuthConfig = {
          loginUrl: env.authorizationEndpoint,
          redirectUri: env.redirectUris,
          clientId: env.clientId,
          scope: '',
          oidc: false
        };
        return (authConfig);
      });
    }

1 Ответ

0 голосов
/ 07 декабря 2018

Вам нужно вернуть созданное обещание из getAuthConfig, чтобы вызывающий getAuthConfig мог правильно ожидать цепочку обещаний, сгенерированную в getAuthConfig:

 async getAuthConfig(): Promise<any> {
     return this.getEnvs().then((data) => {
   //^^^^^^
       // ...
     })

Вы могли бы использовать ее в другом асинхронном методевнутри того же класса, что и:

async whatever() {
  // this will now await for the promise chain  
  // within getAuthConfig and return the result
  const authConfig = await this.getAuthConfig();
}

Поскольку getAuthConfig является асинхронной функцией, вы можете при желании очистить ее, воспользовавшись этим:

async getAuthConfig(): Promise<AuthConfig> {
  const { env } = await this.getEnvs();
  return {
    loginUrl: env.authorizationEndpoint,
    redirectUri: env.redirectUris,
    clientId: env.clientId,
    scope: '',
    oidc: false
  };
}
...