Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.10.2017, 15:30
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

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);

как функция ?
Ответить с цитированием
  #2 (permalink)  
Старый 31.10.2017, 19:18
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

shoopik,
ImessagesOperation это интерфейс, описывающий сигнатуру функции. То есть это
operation: ImessagesOperation
можно переписать как
operation: (messages: Message[]) => Message[]
Ответить с цитированием
  #3 (permalink)  
Старый 31.10.2017, 19:53
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от destus Посмотреть сообщение
shoopik,
ImessagesOperation это интерфейс, описывающий сигнатуру функции. То есть это
operation: ImessagesOperation
можно переписать как
operation: (messages: Message[]) => Message[]
А зачем она здесь используется ? Я так понимаю она берет массив messages и делает из него массив messages ? Просто копию.
Ответить с цитированием
  #4 (permalink)  
Старый 01.11.2017, 06:54
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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

Последний раз редактировалось destus, 01.11.2017 в 08:28.
Ответить с цитированием
  #5 (permalink)  
Старый 01.11.2017, 20:51
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от destus Посмотреть сообщение
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);

Последний раз редактировалось shoopik, 01.11.2017 в 20:55.
Ответить с цитированием
  #6 (permalink)  
Старый 02.11.2017, 06:46
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Как вообще этот operation связывается с updates ?
this.updates.scan((acc, operation) => {}, initialMessage). Что непонятного?) В this.updates и есть эта самая функция IMessagesOperation. scan - аналог reduce.
Вообще на чистом Rx.js проектировать приложение...ну не знаю. Обычно используют всякие обвязки типа ngrx, он же Redux.
Ответить с цитированием
  #7 (permalink)  
Старый 02.11.2017, 17:57
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от destus Посмотреть сообщение
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, и возвращает тот же самый массив ? .
(messages:Message[],
                operation:ImessagesOperation) => {
                 return operation(messages);

Последний раз редактировалось shoopik, 02.11.2017 в 18:13.
Ответить с цитированием
  #8 (permalink)  
Старый 02.11.2017, 19:22
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия: Опытный разработчик Angular / Anguar 2. Москва. AK76 Работа 0 14.08.2017 11:37
Angular task workflow mardoksp Angular.js 0 15.02.2016 21:34
не вызывается функция при изменении option soft4you Общие вопросы Javascript 1 23.07.2014 17:41
AJAX функция для новых html-элементов broadcast77 AJAX и COMET 25 03.03.2014 14:01
Странная ситуация. igsavenko Общие вопросы Javascript 5 23.02.2010 10:04