发布于 2018-06-10 15:31:33
你可以在这里查一下,https://github.com/angular/angular/blob/master/packages/zone.js/NON-STANDARD-APIS.md
这样做的目的是让rxjs在不同的情况下进入正确的区域。
zone.js还提供了一个rxjs修补程序,以确保rxjs可观察/订阅/操作符在正确的区域中运行。详情请参阅拉动请求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包括的内容基本上都包括
修补程序,因此每个异步调用都将在正确的区域中运行。
回答你的评论问题。
不,这不对。目前,没有补丁,每个回调将运行在内部或外部的角度区域取决于发射器。它将与创建回调时无关。
例如。
let sub;
ngZone.runOutsideAngular(() => {
const observable = new Observable(subscriber => sub = subscriber));
observable.subscribe(() => {
// in ngzone
});
});
ngZone.run(() => {
sub.next(1);
});在这种情况下,可观测到的是在角区域之外创建的,但是subscriber.next在角区域内被调用,所以最后,回调仍然在角区域。
使用该修补程序,回调将位于ngzone的外部,因为它是在ngzone之外创建的。
https://stackoverflow.com/questions/50784775
复制相似问题