你可以在这里检查一下,https://github.com/angular/angular/blob/master/packages/zone.js/NON-STANDARD-APIS.md
我们的想法是让rxjs
在不同情况下进入正确的区域。
zone.js 还提供了 rxjs 补丁,以确保 rxjs Observable/Subscription/Operator 在正确的区域中运行。详情请参阅拉取请求 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 包含的所有内容
已修补,因此每个异步调用都将在正确的区域中运行。
回答你的评论问题。
不,这是不正确的。
目前,如果没有补丁,每个回调将在角度区域内部或外部运行,具体取决于发射器。它与回调的创建时间无关。
例如。
let sub;
ngZone.runOutsideAngular(() => {
const observable = new Observable(subscriber => sub = subscriber));
observable.subscribe(() => {
// in ngzone
});
});
ngZone.run(() => {
sub.next(1);
});
在这种情况下,observable是在角度区域之外创建的,但是subscriber.next是在角度区域内调用的,所以最后,回调仍将在角度区域中。
使用补丁后,回调将在 ngzone 之外,因为它是在 ngzone 之外创建的。