##// END OF EJS Templates
working on Observable tests
working on Observable tests

File last commit:

r24:70558f9420b3 propose observables
r24:70558f9420b3 propose observables
Show More
observable.ru.md
84 lines | 3.0 KiB | text/x-minidsrc | MarkdownLexer

Observable

Универсальный способ организации потока сообщений. Данный механизм может использоваться для оповещения об изменениях состояний объектов или для доставки самостоятельных событий, например, связанных с действиями пользователя.

Является реализацией классического шаблона наблюдателя с возможность сообщить о коце потока событий. Данная реализация не содержит никаких дополнительных функций, таких как фильтрация, канал с состоянием, преобразования сообщений и т.п. Это сделано специально, чтобы реализация оставалась максимально простой.

Пример того, как можно создать последовательность из 10 событий:

var events = new Observable(async (notify, error, complete) => {
    // цикл в котором возникает событие
    for(let i = 0; i < 10; i++) {
        await delay(1000);
        // в качестве данных передается номер события
        notify(i);
    }
    // по окончании последовательности информируем, что событий больше не будет
    compelte();
});

// создаем окно с отображением хода событий
var progress = showProgress({ min: 0, max: 9, current: 0});

// подписываемся на события
events.on(
    // обработчик очередного события
    msg => {
        progress.setValue(msg);
    }.
    // обработчик ошибки
    e => {
        progress.showError(e);
    },
    // обработчик конца потока
    () => {
        progress.close();
    }
);

Пример создания Observable из событий другого объекта, например, виджета:

postCreate() {
    // превращаем события виджета в Observable
    this.mouseMove = new Observable((notify) => {
        this.moveArea.on('mousemove',(x) => notify(x.) );
    });
}

Пример инициализации Observable внутри класса и генерация событий:

class PositionWidget extends Widget {
    _nextPosition: (pos: Position) => void

    _complete: () => void

    readonly position: Observable<Position>;

    constructor(...args[]) {
        super(args);

        this.position = new Observable<Position>((notify, error, complete) => {
            this._nextPosition = notify;
            this._complete = complete
        });
    }

    destroy() {
        this._complete();

        super();
    }
}