如果包含在主模块中,则在某些模块(swagger-client)中,Promise不在有角度的NgZone范围内,而在延迟加载下一切正常

时间:2019-01-23 11:23:52

标签: angular swagger

我们需要在我们的角度应用程序中使用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 js,有一个承诺的polyfill(不确定是否相关)
  • 取决于应用中首次调用“新Swagger”的时间,swagger模块使用的承诺可能未经过角度修改,因此所有进一步的swagger承诺都会在角度区域之外创建承诺。
  • li>

不确定我是否可以解决此问题。关于如何加载模块或其他东西似乎是一个角度问题。也许是一个招摇的模块错误,但我对此表示怀疑。

注意:

  • 代码不必执行。

例如,如果我在延迟加载的组件中有多个swagger调用,则一切正常。 如果我在所有未延迟加载的组件中添加了swagger调用(它在主模块中),即使从未执行过该代码,它也会破坏swagger返回的所有其他已实现的诺言

0 个答案:

没有答案