Promise находится вне углового NgZone в определенном модуле (swagger-client), если он включен в основной модуль, в то время как все работает нормально с отложенной загрузкой - PullRequest
0 голосов
/ 23 января 2019

Нам нужно использовать swagger-client в нашем угловом приложении для выполнения вызовов API. Проблема в том, что обещания находятся за пределами угловой зоны.

Я знаю, что могу использовать ngZone.run, но я хотел бы избежать этого для согласованности. Если нет другого решения, мне нужно создать оболочку для модуля swagger.

В приведенном ниже коде обещание, возвращаемое swagger, находится за пределами угловой зоны, в то время как обещание, возвращаемое функцией токена, находится в NgZone.

Теперь о странной части. Это происходит только в том случае, если код находится в корне приложения (основного модуля).

Если тот же код перемещен в компонент с отложенной загрузкой, обещание swagger-client находится в угловой зоне. Если один и тот же код находится в корневом и ленивом загруженном компонентах, то оба обещания клиента swagger будут находиться за пределами угловой зоны.

import { Component, NgZone } from '@angular/core';
import * as Swagger from 'swagger-client';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'angular';

  token(): any {
    const promise =  new Promise((resolve, reject) => {
      setTimeout(() => {
        return resolve(!!localStorage.getItem('token'));
      }, 14000);
    });

    return promise;
  }

  constructor() {
    setTimeout(() => {
      new Swagger({
        url: '/somethingSpec/spec'
      }).then(client => {
        console.log(NgZone.isInAngularZone());
      }).catch(error => {
        console.log(NgZone.isInAngularZone());
      }
      );
    }, 7000);

    this.token().then((token) => {
      console.log(token, NgZone.isInAngularZone());
    });
  }
}

Из моего понимания:

  • swagger js, имеет заполнение для обещания (не уверен, актуально это или нет)
  • в зависимости от того, когда в приложении впервые вызывается «новый Swagger», обещание, используемое модулем Swagger, возможно, не было изменено угловым, и поэтому все дальнейшие обещания Swagger будут создавать обещания за пределами угловой зоны

Не уверен, что это можно исправить мной. Похоже, проблема заключается в том, как загружаются модули или что-то в этом роде. Возможно, ошибка в модуле чванства, но я в этом немного сомневаюсь.

Примечание:

  • код не должен быть выполнен.

Например, если у меня несколько вызовов swagger в загруженных компонентах, все в порядке. Если я добавлю вызов swagger, в любой компонент, который не загружен лениво (он находится в основном модуле), даже если код никогда не выполняется, он нарушит все другие обещания, возвращаемые swagger, которые ранее работали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...