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); как функция ? |
shoopik,
ImessagesOperation это интерфейс, описывающий сигнатуру функции. То есть это operation: ImessagesOperationможно переписать как operation: (messages: Message[]) => Message[] |
Цитата:
|
shoopik,
А что содержится в this.updates? Там и должны быть эти самые функции типа ImessagesOperation. |
Цитата:
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); |
Цитата:
Вообще на чистом Rx.js проектировать приложение...ну не знаю. Обычно используют всякие обвязки типа ngrx, он же Redux. |
Цитата:
Про чистый 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); |
shoopik,
Не обязательно суммирует. Там может быть и acc - curr и acc * curr. Не важно. Короче говоря, из приведенного выше кода, я так понял что в результате всего этого у нас старые сообщения конкатенируются с новыми. То есть это своего рода состояние всех сообщений в приложении. |
Часовой пояс GMT +3, время: 20:49. |