zone.js/dist/zone-patch-rxjs的用途

Ser*_*lov 11 rxjs zone.js angular

可能我对问题太迟了,但无论如何.

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

我使用zoneRxJs在我的Angular项目中,尽管make rxjs run in correct zone在PR的描述中看到我不完全理解它何时可以帮助我或它应该为我解决什么问题.

我会很感激像之前/之后的一些代码示例.

提前致谢.

jia*_*ion 12

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

我们的想法是让rxjs不同情况下进入正确的区域.

zone.js还提供了一个rxjs补丁,以确保rxjs Observable/Subscription/Operator在正确的区域中运行.有关详细信息,请参阅pull请求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. 
  });
});
Run Code Online (Sandbox Code Playgroud)

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

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

被修补,因此每个异步调用将在正确的区域中运行.

回答你的评论问题.

不,这不对.目前,没有补丁,每个回调将在角度区域内部或外部运行取决于发射器.它与创建回调时无关.

例如.

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

ngZone.run(() => {
  sub.next(1);
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可观察量是在角度区域之外创建的,但是subscriber.next在角度区域内被调用,所以最后,回调仍将在角度区域中.

使用补丁,回调将在ngzone之外,因为它是在ngzone之外创建的.