##// 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
/ docs / observable.ru.md
cin
documenting...
r23 # Observable
Универсальный способ организации потока сообщений. Данный механизм может
использоваться для оповещения об изменениях состояний объектов или для доставки
самостоятельных событий, например, связанных с действиями пользователя.
Является реализацией классического шаблона наблюдателя с возможность сообщить
о коце потока событий. Данная реализация не содержит никаких дополнительных
функций, таких как фильтрация, канал с состоянием, преобразования сообщений и
т.п. Это сделано специально, чтобы реализация оставалась максимально простой.
Пример того, как можно создать последовательность из 10 событий:
```ts
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();
}
);
```
cin
working on Observable tests
r24 Пример создания `Observable` из событий другого объекта, например, виджета:
cin
documenting...
r23
```ts
cin
working on Observable tests
r24 postCreate() {
// превращаем события виджета в Observable
this.mouseMove = new Observable((notify) => {
this.moveArea.on('mousemove',(x) => notify(x.) );
});
cin
documenting...
r23 }
```
cin
working on Observable tests
r24 Пример инициализации `Observable` внутри класса и генерация событий:
cin
documenting...
r23
```ts
cin
working on Observable tests
r24
class PositionWidget extends Widget {
cin
documenting...
r23 _nextPosition: (pos: Position) => void
cin
working on Observable tests
r24
cin
documenting...
r23 _complete: () => void
cin
working on Observable tests
r24 readonly position: Observable<Position>;
cin
documenting...
r23
cin
working on Observable tests
r24 constructor(...args[]) {
cin
documenting...
r23 super(args);
this.position = new Observable<Position>((notify, error, complete) => {
this._nextPosition = notify;
this._complete = complete
});
}
destroy() {
this._complete();
super();
}
}
```