Почему он передает console.log как аргумент функции подписки Observble ()?
Я довольно новичок в угловом и функциональном программировании, и у меня есть сомнения по поводу этого синтаксиса (который, я думаю, должен быть связан с поведением функционального программирования):
courses$: Observable<{}[]>;
.................................
.................................
.................................
this.courses$.subscribe(console.log);
Поэтому курсы $ должны быть массивом Observable (что именно означает синтаксис <{} []>?)
Кажется, последняя строка выводит на консоль JavaScript подписанный контент. Но что именно означает этот синтаксис? Я знаю, что console.log() - это функция, которая принимает в качестве аргумента значение, которое должно быть напечатано. Почему в этом случае он является аргументом функции подписки и не заканчивается на ()?
3 ответа
Чтобы лучше понять это: в JavaScript функции являются объектами первого класса, что означает, что они могут рассматриваться как обычные переменные, передаваться как аргументы, изменяться или удаляться. Взгляните на это:
something => console.log(something)
Как видите, это функция, которая записывает что-то на консоль. И что console.log
? Ну, это функция, которая записывает что-то на консоль, ничем не отличается!
Рассмотрим этот псевдокод:
Observable.prototype.subscribe = function(callback) {
// every time a new value is emitted
callback(newValue);
}
Конечно, это не так, как .subscribe
Метод реализован на самом деле, но это, по сути, то, что он делает: когда наблюдаемая получает новый фрагмент данных, она вызывает обратный вызов, который вы предоставили, передавая next
значение в качестве первого аргумента для этого обратного вызова. Надеюсь, это прояснит для вас.
Это проходит console.log
, ссылка на функцию, в subscribe
, Подписаться будет вызывать эту функцию позже, когда будет опубликована подписка. Аргумент (ы), которые он передает, определяются по подписке в тот момент, когда он срабатывает. Это просто передача функции обратного вызова в подписку.
subscribe
принимает функцию в качестве аргумента типа (parameter: T) => void
где Т - шаблон Observable<T>
,
эти три работают аналогично:
this.courses$.subscribe(console.log);
this.courses$.subscribe(function (p: {}[]): void { console.log(p); });
this.courses$.subscribe((p: {}[]): void => console.log(p));
Есть несколько различий между захваченными переменными и областями действия между каждым типом объявления функции, но в этом конкретном примере они работают одинаково.