Почему он передает console.log в качестве аргумента функции Observble subscribe()?

Я довольно новичок в Angular и функциональном программировании, и у меня есть сомнения по поводу этого синтаксиса (который, я думаю, должен быть связан с поведением функционального программирования):

courses$: Observable<{}[]>;
.................................
.................................
.................................
this.courses$.subscribe(console.log);

Таким образом, courses$ должен быть массивом Observable (что именно означает синтаксис ‹{}[]>?)

Последняя строка выводит в консоль JavaScript подписанный контент. Но что именно означает этот синтаксис? Я знаю, что console.log() — это функция, которая принимает в качестве аргумента значение, которое должно быть напечатано. Почему в данном случае это аргумент функции подписки и он не заканчивается на ()?


person AndreaNobili    schedule 04.01.2018    source источник
comment
Observable<{}[]> означает, что это Observable массива простых объектов, т.е., например, [{},{},{}]   -  person n00dl3    schedule 04.01.2018


Ответы (3)


Чтобы понять это лучше: в JavaScript функции являются объектами первого класса, что означает, что они могут рассматриваться как обычные переменные, передаваться в качестве аргументов, изменяться или удаляться. Взгляните на это:

something => console.log(something)

Как видите, это функция, которая что-то записывает в консоль. А что такое console.log? Ну, это функция, которая записывает что-то в консоль, ничем не отличается!

Рассмотрим этот псевдокод:

Observable.prototype.subscribe = function(callback) {
   // every time a new value is emitted 
   callback(newValue);
}

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

person Armen Vardanyan    schedule 04.01.2018

Он передает console.log, ссылку на функцию, в subscribe. Subscribe вызовет эту функцию позже, когда подписка будет опубликована. Аргументы, которые он передает, определяются подпиской в ​​момент его запуска. Это просто передача функции обратного вызова в subscribe.

person T.J. Crowder    schedule 04.01.2018
comment
Кроме того, если бы вы передали console.log(), вы бы выполнили эту функцию и передали бы ее результат вместо ссылки на саму функцию. - person ajm; 04.01.2018
comment
Subscribe вызовет эту функцию позже, когда наблюдаемый объект вызовет функцию next. Он не будет вызываться на complete или error, для чего предназначены параметры 2 и 3 метода subscribe - person mhodges; 04.01.2018

subscribe принимает в качестве аргумента функцию типа (parameter: T) => void, где T — шаблон Observable<T>.

эти три работают одинаково:

this.courses$.subscribe(console.log);
this.courses$.subscribe(function (p: {}[]): void { console.log(p); });
this.courses$.subscribe((p: {}[]): void => console.log(p));

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

person Badashi    schedule 04.01.2018