개요
UniRx를 사용함에 앞서 가장 기본이 되는 Observable작성방법을 생각보다 찾기 힘들었던 관계로 글로 남겨두고자 한다.
본론
Rx는 Promise++ specs를 따르고 있다고 한다.
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
Promise/A+사양인 bluebird의 경우, 아래와 같은 형태의 Promise를 정의하는 것이 가능하다.
// Definition
var Promise = require("bluebird");
var example = new Promise(function(resolve,reject) {
try {
// something do
var some_result_value = ...;
// then
resolve(some_result_value);
} catch(ex) {
reject(ex);
}
});
// Usage
example
.then(function(some_result_value) {
// some_result_value is coming.
}).catch(function(ex) {
// ex is coming.
});
Rx의 경우 Promise의 일종이기때문에 비슷하게 정의를 할 수가있는데
위와 같은 정의를 하자면
// Definition
var example = Observable.Create<T>(observer=> {
try {
// something do
T some_result_value = ...;
observer.OnNext(some_result_value);
} catch(ex) {
observer.OnError(ex);
}
observer.OnCompleted();
return Disposable.Create(()=> {
// something dispose here if required
});
});
// Usage
example.Subscribe(some_result_value=> {
// some_result_value is coming
},ex=> {
// ex is coming
},()=> {
// OnCompleted calling
});
위와 같이 사용할 수 있다.
ex를 알기 쉽게 하기 위해 try catch를 넣었으나, 비동기 코드를 작성하려 할 경우 일반적인 비동기 운용에 기반한 코드를 작성하고, 필요한 시점에 위에 적힌것과 같은 이벤트 호출을 실시하면 된다.
혹은 간단하게 Coroutine용 IEnumerator function을 작성한 후, Observable.FromCoroutine()을 사용하는 방법도 있다.
댓글 없음:
댓글 쓰기