我正在尝试创建一个Observable,该Observable不断查询外部服务的更新,如果有新服务,则发出更新:
this._loop = new Rx.Observable<TDL.Result>(subscriber =>
{
let shouldLoop = true;
while (shouldLoop)
{
if (!this._client)
throw new Error("This client is not initialised.");
const update = this._lib.receiveSync(this._client, 5);
if (!update)
continue;
if (update._ === "error")
this.emit("error", update);
else
this.emit("update", update);
subscriber.next(update);
}
// never gets here b/c of while loop, so subscribing to this Observable
// causes everything to block
// cancellation logic
return () =>
{
shouldLoop = false;
this._loop = null;
};
}).pipe(RxOp.publish()) as Rx.ConnectableObservable<TDL.Result>;
this._loopSubscription = this._loop.connect();
但是,subscribe函数正在阻塞,这意味着我调用connect()
时,代码将暂停。如何重写此代码以使订阅功能不阻塞?
答案 0 :(得分:0)
感谢@martin,解决方案非常明显。我不知道为什么我没有想到这个
this._loop = new Rx.Observable<TDL.Result>(subscriber =>
{
let shouldLoop = true;
process.nextTick(() =>
{
while (shouldLoop)
{
if (!this._client)
throw new Error("This client is not initialised.");
const update = this._lib.receiveSync(this._client, 5);
if (!update)
continue;
if (update._ === "error")
this.emit("error", update);
else
this.emit("update", update);
subscriber.next(update);
}
});
// cancellation logic
return () =>
{
shouldLoop = false;
this._loop = null;
};
}).pipe(RxOp.publish()) as Rx.ConnectableObservable<TDL.Result>;