我正在尝试取消我的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的当前版本?
答案 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。