Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   angular 2 странная функция (https://javascript.ru/forum/angular/71180-angular-2-strannaya-funkciya.html)

shoopik 31.10.2017 15:30

angular 2 странная функция
 
Здравствуйте, натолкнулся на код, и не могу разобрать его.

interface ImessagesOperation extends Function {
    (messages: Message []):Message[];
}

 newMessages: Subject<Message> = new Subject<Message>();
    updates:Subject<any> = new Subject<any>();
    create:Subject<any> = new Subject<any>();   
    messages:Observable<Message[]>;
    martThreadAsRead:Subject<any> = new Subject<any>();

    constructor() {
        this.messages = this.updates
            .scan((messages:Message[],
                operation:ImessagesOperation) => {
                    return operation(messages);
                },
            initialMessages)
            .publishReplay(1)
            .refCount;

        this.create
            .map( function(message: Message) : ImessagesOperation {
                return (messages: Message[]) => {
                    return messages.concat(message);
                }
            })
            .subscribe(this.updates);

        this.newMessages
            .subscribe(this.create);
    }


Что это за магическая функция, что она делает и возвращает ?

interface ImessagesOperation extends Function {
    (messages: Message []):Message[];
}


.scan((messages:Message[],
                operation:ImessagesOperation) => {
                    return operation(messages);
                },

И здесь есть operation, первый принимается как параметр, второй
operation(messages);

как функция ?

destus 31.10.2017 19:18

shoopik,
ImessagesOperation это интерфейс, описывающий сигнатуру функции. То есть это
operation: ImessagesOperation
можно переписать как
operation: (messages: Message[]) => Message[]

shoopik 31.10.2017 19:53

Цитата:

Сообщение от destus (Сообщение 468767)
shoopik,
ImessagesOperation это интерфейс, описывающий сигнатуру функции. То есть это
operation: ImessagesOperation
можно переписать как
operation: (messages: Message[]) => Message[]

А зачем она здесь используется ? Я так понимаю она берет массив messages и делает из него массив messages ? Просто копию.

destus 01.11.2017 06:54

shoopik,
А что содержится в this.updates? Там и должны быть эти самые функции типа ImessagesOperation.

shoopik 01.11.2017 20:51

Цитата:

Сообщение от destus (Сообщение 468778)
shoopik,
А что содержится в this.updates? Там и должны быть эти самые функции типа ImessagesOperation.

Как вообще этот operation связывается с updates ? :)
updates: Subject<any> = new Subject<any>();

Вот в таком порядке идёт, больше по-моему нигде не используется this.updates.
Сначала добавляется новое сообщение:
addMessage(message: Message): void {
    this.newMessages.next(message);
  }

Потом оно передается в this.create?
this.newMessages
      .subscribe(this.create);

Вот здесь функция типа :IMessageOperation. Она добавляет новое сообщение в массив сообщений. Подозреваю это она и есть. Но как она привязывается к operation я не понимаю. И что она делает в this.messages.
this.create
      .map( function(message: Message): IMessagesOperation {
        return (messages: Message[]) => {
          return messages.concat(message);
        };
      })
      .subscribe(this.updates);

destus 02.11.2017 06:46

Цитата:

Как вообще этот operation связывается с updates ?
this.updates.scan((acc, operation) => {}, initialMessage). Что непонятного?) В this.updates и есть эта самая функция IMessagesOperation. scan - аналог reduce.
Вообще на чистом Rx.js проектировать приложение...ну не знаю. Обычно используют всякие обвязки типа ngrx, он же Redux.

shoopik 02.11.2017 17:57

Цитата:

Сообщение от destus (Сообщение 468881)
this.updates.scan((acc, operation) => {}, initialMessage). Что непонятного?) В this.updates и есть эта самая функция IMessagesOperation. scan - аналог reduce.
Вообще на чистом Rx.js проектировать приложение...ну не знаю. Обычно используют всякие обвязки типа ngrx, он же Redux.

this.updates - просто создается subject, где она там я не понимаю )))
Про чистый Rx.js - так я просто разбираюсь, не знаю как обычно то делают :)
Я не понимаю как здесь происходит,
Функция scan:
.scan((acc, curr) => acc + curr); она суммирует acc и curr, но в примере же немного по-другому. В примере который я скинул, там суммируется return operation(messages); и initialmessages ? Я запутался)
Я прочитал, что scan для аккумулирования. У нас на входе messages u operation, messages - это массив, ок, но operation - это функция ?
(acc, operation) - это я вижу, но дальше не понятно, =>{}, т.е. он берет здесь массив сообщений, берет operation, и возвращает тот же самый массив ? :write:.
(messages:Message[],
                operation:ImessagesOperation) => {
                 return operation(messages);

destus 02.11.2017 19:22

shoopik,
Не обязательно суммирует. Там может быть и acc - curr и acc * curr. Не важно. Короче говоря, из приведенного выше кода, я так понял что в результате всего этого у нас старые сообщения конкатенируются с новыми. То есть это своего рода состояние всех сообщений в приложении.


Часовой пояс GMT +3, время: 20:49.