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, время: 09:44. |