区域的用途。js/dist/zone-patch-rxjs

Purpose of zone.js/dist/zone-patch-rxjs

可能我问的太晚了,但无论如何。

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

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

我希望能提供一些代码示例,例如 before/after。

提前致谢。

你可以在这里查看,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 之外创建的。