gpt4 book ai didi

angular - zone.js/dist/zone-patch-rxjs 的目的

转载 作者:太空狗 更新时间:2023-10-29 17:07:02 29 4
gpt4 key购买 nike

可能我问这个问题已经太晚了,但无论如何。

有人可以解释一下在什么情况下我需要导入区域的补丁 - zone.js/dist/zone-patch-rxjs。据我所知,补丁已添加到此 PR 中(this one 的继承者)。

我在我的 Angular 项目中使用了 zoneRxJs,尽管看到了 make rxjs run in correct zone PR的描述我不太明白它什么时候可以帮到我,应该为我解决什么问题。

我会很感激一些代码示例,比如之前/之后。

提前致谢。

最佳答案

你可以在这里查看,https://github.com/angular/angular/blob/master/packages/zone.js/NON-STANDARD-APIS.md

想法是让 rxjs 在不同情况下运行到正确的区域。

zone.js 还提供了一个 rxjs 补丁,以确保 rxjs Observable/Subscription/Operator 在正确的区域中运行。详情请引用pull request 843 .以下示例代码描述了这个想法。

const constructorZone = Zone.current.fork({name: 'constructor'});
const subscriptionZone = Zone.current.fork({name: 'subscription'});
const operatorZone = Zone.current.fork({name: 'operator'});

let observable;
let subscriber;
constructorZone.run(() => {
observable = new Observable((_subscriber) => {
subscriber = _subscriber;
console.log('current zone when construct observable:',
Zone.current.name); // will output constructor.
return () => {
console.log('current zone when unsubscribe observable:',
Zone.current.name); // will output constructor.
}
});
});

subscriptionZone.run(() => {
observable.subscribe(() => {
console.log('current zone when subscription next',
Zone.current.name); // will output subscription.
}, () => {
console.log('current zone when subscription error', d
Zone.current.name); // will output subscription.
}, () => {
console.log('current zone when subscription complete',
Zone.current.name); // will output subscription.
});
});

operatorZone.run(() => {
observable.map(() => {
console.log('current zone when map operator', Zone.current.name);
// will output operator.
});
});

目前基本上 rxjs API 包含的所有内容

  • 可观察
  • 订阅
  • 订户
  • 运营商
  • 调度员

已打补丁,因此每个异步调用都将在正确的区域中运行。

回答您的评论问题。

不,这是不正确的。目前,如果没有补丁,每个回调将在 Angular 区域内部或外部运行,具体取决于发射器。它与回调的创建时间无关。

例如。

let sub;
ngZone.runOutsideAngular(() => {
const observable = new Observable(subscriber => sub = subscriber));
observable.subscribe(() => {
// in ngzone
});
});

ngZone.run(() => {
sub.next(1);
});

在这种情况下,observable 是在 Angular 区外创建的,但 subscriber.next 是在 Angular 区内调用的,所以最后,回调仍将在 Angular 区内。

有了补丁,回调将在 ngzone 之外,因为它是在 ngzone 之外创建的。

关于angular - zone.js/dist/zone-patch-rxjs 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784775/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com