1) Это зависит.подписка выполняет код только после завершения действия.Итак, когда this.service.getData()
закончил свою работу.SetTimeout выполняет работу после задержки.Если подписке требуется меньше времени, чем setTimeout, она будет выполнена первой.
2) Может быть, вы пытались заметить, когда выполняется функция?
3) AfterViewInit запускается несколько раз,Вы можете проверить вот так if(!!something)
и затем выполнить некоторый код.
4) вам следует ВСЕГДА избегать использования settimeout (просто используйте его в целях отладки).
РЕДАКТИРОВАТЬ:
ngOnInit () {
this._service.getProducts().subscribe(
((data : Product[]) => this.dataSource = new MatTableDataSource(data)),
() => console.log('THIS IS ERROR')
);
setTimeout(() => this.dataSource.paginator = this.paginator);
//this.dataSource.paginator = this.paginator;
} `
Давайте просто немного этот код:
ngOnInit() {
this.service.doStuff()
.subscribe(result => {
this.functionA();
},
err => {
//Do other stuff in case of an error
});
this.functionB();
}
functionA(){
console.log("Hello,");
}
functionB(){
console.log("world!");
}
Вывод этого кода будет:
world!Hello,
Но почему?
Это из-за шаблона observable
.
Вы можете себе это представить, когда вы гуляете с двумя людьми: один знает английский, а другой нет.Так что даже если вы скажете "Как дела?"сначала парню, который не знает английского, ему понадобится время, чтобы понять, что ты сказал, и ответить тебе.В то же время другой парень (который очень хорошо знает английский) ответит вам мгновенно.
Пример functionA
и functionB
такой же.Функция A выполняется только , когда подписка что-то ловит.Вот почему он не выстрелил первым.Вы можете видеть, что установка точки отладки здесь:
ngOnInit() {
this.service.doStuff()
.subscribe(result => {
---> this.functionA();
},
err => {
//Do other stuff in case of an error
});
---> this.functionB();
}
, надеюсь, хорошо объяснила это.
Теперь давайте перейдем к , давайте использовать время ожидания:
ngOnInit() {
this.service.doStuff()
.subscribe(result => {
this.functionA();
},
err => {
//Do other stuff in case of an error
});
settimeout(() => {
this.functionB();
}, 500);
}
Какая функция будет выполнена первой?
Спойлер: Вы не можете этого знать.
Если вам интересно, почему, это легко: вы точно знаете, что функция B будет вызываться через 500 мс, но вы не можете знать, скольковремя будет использовать подписку, чтобы быть готовым.Поэтому, если вам повезло, и ваша подписка обычно требует около 500 мс, вы можете попытаться перезагрузить страницу несколько раз, иногда вы увидите Hello, world!
, иногда вы увидите world!Hello,
.
Чтобы ответитьлучше на ваши вопросы: я действительно не знаю, почему вы поместили код, как это, буквально понятия не имею.
ngAfterViewInit представляет собой life-cycle
с именем после ngOnInitи выполните логику после того, как Angular полностью инициализирует представление компонента.