如何在角度8中启用区域感知的蓝鸟承诺?

时间:2019-12-15 10:59:20

标签: angular typescript bluebird zone.js

我正在尝试取消我的angular 8项目中的所有承诺。在寻找满足此需求的库时,我发现bluebird.js看起来很有前途;-)

然后,我找到并遵循these instructions,将蓝鸟与angular的区域感知承诺相结合。该参考文献期望这些库可以在index.html中作为src使用。因此,要复制所需的javascript文件,请将以下内容放入angular.json

"assets": [
    "src/favicon.ico",
    "src/assets",
    {
      "glob": "**/*",
      "input": "./node_modules/zone.js",
      "output": "./assets/zone.js/"
    },
    {
      "glob": "**/*",
      "input": "./node_modules/bluebird",
      "output": "./assets/bluebird/"
    }
]

在我的index.html中添加了以下内容:

  <script src="/assets/zone.js/dist/zone.js"></script>
  <script src="/assets/bluebird/js/browser/bluebird.js"></script>
  <script src="/assets/zone.js/dist/zone-bluebird.js"></script>
  <script>
    Zone[Zone['__symbol__']('bluebird')](Promise);
    Promise.config({cancellation: true});
  </script>

但是不幸的是,尝试该操作时我只收到错误Uncaught TypeError: Bluebird.onPossiblyUnhandledRejection is not a function

如果我没有在index.html中手动导入脚本,而是将代码移到main.ts上,则会遇到相同的错误。

我尝试将main.ts中的代码更改为以下内容:

import { Promise as Bluebird } from 'bluebird';
import 'zone.js/dist/zone-bluebird';
declare var Zone: any;
Zone[Zone['__symbol__']('bluebird')](Bluebird);
Bluebird.config({cancellation: true});

但这给了我错误Zone.js has detected that ZoneAwarePromise (window|global) Promise has been overwritten.

是否知道如何实现此目标,或者是否有可能使用angular和zone.js的当前版本?

2 个答案:

答案 0 :(得分:1)

我在这里更新了文档。

角度用法:

在polyfills.ts中,导入zone-bluebird程序包。

import 'zone.js/dist/zone'; // Included with Angular CLI.
import 'zone.js/dist/zone-bluebird';

在main.ts中,修补了bluebird。

platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .then(_ => {
import('bluebird').then(Bluebird => {const Zone = (window as any)['Zone']; Zone[Zone['__symbol__']('bluebird')](Bluebird.default);});
    })
    .catch(err => console.error(err));

此后,Promise将变为Bluebird,然后是Bluebird。然后将位于角区域。

请测试,如果有任何问题,请告诉我。

答案 1 :(得分:0)

如果我让引导发生在 之后,就可以了(我一直以为我尝试应用“ bluebird模式”为时已晚,但显然太早了 < / em>):

platformBrowserDynamic().bootstrapModule(AppModule)
  .then(() => {
    Zone[Zone['__symbol__']('bluebird')](Bluebird);
    Bluebird.config({cancellation: true});
  })

边注(实际上不在原始问题的范围内): 遗憾的是,这仍然不能让我取消异步功能-只有取消直接引用的Promises(现在是所有Bluebirds)才会实际调用onCancel回调。 为此,我需要像cancelable-awaiter这样的东西,但是我不能使它与angular一起使用-请参阅the issue #1