gpt4 book ai didi

typescript - RXJS:向 Observable 添加一个函数以在订阅时执行(延迟)

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:31 25 4
gpt4 key购买 nike

向 Observable 添加一个函数以在订阅时执行(延迟)

我有一个由事件组成的 Observable。在这种情况下,蓝牙通知。

我只想在有人订阅该 Observable 时运行一个函数 (startNotifictions)。

此代码在以前的版本上确实有效。它采用 Ionic3 框架。它添加了一个新的运算符,在订阅时运行。现在转译器的类型有问题,提示两次,.doOnSubscribe 在 typedef Observable any> 和 <{}> 上不可用。

有人知道如何正确输入吗?也许延长?尝试直接使用 .defer,无济于事。

 // add operator doOnSubscribe to the event observable
Observable.prototype.doOnSubscribe = function(onSubscribe) {
let source = this;
return Observable.defer(() => {
onSubscribe();
return source;
});
};

// return the Observable for the notify char, with startNotify on first subscribe
getUartDataNote( Observable.fromEvent( this.uartChar, 'characteristicvaluechanged' )
.doOnSubscribe(() => {
console.log('starting note');
this.uartChar.startNotifications();
})
.map( value => String.fromCharCode.apply( null, new Uint8Array( this.uartChar.value.buffer )))
.takeUntil( Observable.fromEvent( this.gatt.device, 'gattserverdisconnected' ))
.finally(() => {
console.log( 'stream disconnected ');
// not necessary: return this.uartChar.stopNotifications()
})
.share()
);

最佳答案

如果您使用的是 rxjs 版本 5,则可以使用纯函数而不是修补原型(prototype)来实现 doOnSubscribe。这样您就不需要类型扩充。

import {defer} from 'rxjs/observable/defer';
import {Observable} from 'rxjs/Observable';

/** Example
import {from} from 'rxjs/observable/from';

from([1, 2, 3])
.pipe(doOnSubscribe(() => console.log('subscribed to stream')))
.subscribe(x => console.log(x), null, () => console.log('completed'));
*/

export function doOnSubscribe<T>(onSubscribe: () => void): (source: Observable<T>) => Observable<T> {
return function inner(source: Observable<T>): Observable<T> {
return defer(() => {
onSubscribe();

return source;
});
};
}

https://gist.github.com/evxn/750702f7c8e8d5a32c7b53167fe14d8d

关于typescript - RXJS:向 Observable 添加一个函数以在订阅时执行(延迟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46881510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com