Вы можете проверить это здесь, 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.