我们需要在我们的角度应用程序中使用swagger-client进行api调用。问题在于,诺言不在角度区域内。
我知道我可以使用ngZone.run,但是为了保持一致性我想避免这样做。如果没有其他解决方案,则需要为swagger模块创建一个包装器。
在下面的代码中,swagger返回的promise在角度区域之外,而token函数返回的promise在NgZone中。
现在开始怪异的部分。 仅当代码位于应用程序(主模块)的根目录中时,这种情况才会发生。
如果将相同的代码移动到延迟加载的组件,则swagger-client promise在角度区域中。如果在根和延迟加载的组件中都包含相同的代码,则这两个昂首阔步的客户承诺都将在角度区域之外。
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调用,则一切正常。 如果我在所有未延迟加载的组件中添加了swagger调用(它在主模块中),即使从未执行过该代码,它也会破坏swagger返回的所有其他已实现的诺言