Нам нужно использовать 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, которые ранее работали