Назначение zone.js / dist / zone-patch-rxjs - PullRequest
0 голосов
/ 10 июня 2018

Возможно, я опоздал с вопросом, но все равно.

Может кто-нибудь объяснить мне, в каких случаях мне нужно импортировать патч зоны - zone.js/dist/zone-patch-rxjs.Насколько я знаю, патч был добавлен в этот PR (преемник этот ).

Я использую zone и RxJs в моем Angular проект и, несмотря на то, что я вижу make rxjs run in correct zone в описании PR, я не до конца понимаю, когда он может мне помочь или какие проблемы он должен решить для меня.

Буду признателен за некоторые примеры кода, такие как до / после.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 июня 2018

Вы можете проверить это здесь, https://github.com/angular/zone.js/blob/master/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. 
  });
});

В настоящее время в основном все, что API-интерфейс rxjs включает в себя

  • Observable
  • Подписка
  • Абонент
  • Операторы
  • Планировщик

исправлен, поэтому каждый асинхронный вызов будет выполняться в правильной зоне.

Чтобы ответить на ваш комментарий вопрос.

Нет, это не правильно.В настоящее время без патча каждый обратный вызов будет выполняться внутри или снаружи угловой зоны, в зависимости от излучателя.Это не будет иметь ничего общего с созданием обратного вызова. Например,

.

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

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

в этом случае наблюдаемое было создано за пределами угловой зоны, но subscriber.next былвызывается внутри угловой зоны, поэтому, наконец, обратный вызов все еще будет находиться в угловой зоне.

с патчем, обратный вызов будет находиться за пределами ngzone, поскольку он создается за пределами ngzone.

...