Tauri:将listen(eventName, handler)转换为Angular要处理的Observable.&l



如果您正在使用JS,那么文档工作得很好。但在angular的情况下,我更喜欢处理可观察对象而不是承诺。问题是这种承诺有一个处理程序。我尝试了下面列出的许多方法,但似乎都不起作用。

from(listen("click", v => v))
let x = async() => listen("click", v => v)

有人知道如何将这种事件转换为Observable吗?

响应总是这样:

function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
}

您必须自己用new Observable创建一个Observable

const obs$ = new Observable((subscriber) => {
const unlisten = listen("click", v => subscriber.next(v))
return async () => {  
(await unlisten)()
}
})

在回调中,我们对事件进行listen,并将每个事件传递给subscriber.next(v)

我们还希望在取消订阅Observable时调用unlisten来清理事件侦听器。我们可以通过返回unlisten来做到这一点。当Observable被取消订阅时,回调返回的函数将被调用。

多亏了@Tobias S,我才能够创建这两个函数并在我所有的服务中重用它们。

import {from, map, Observable, ObservableInput, ObservedValueOf} from "rxjs";
import {emit, listen, Event} from "@tauri-apps/api/event";
export function tauriListen(listenerName: string): Observable<any> {
return new Observable<any>((subscriber) => {
// return from(listen(listenerName, v => subscriber.next(v))).subscribe()
const unlisten = listen(listenerName, v => subscriber.next(v))
return async () => {
(await unlisten)()
}
}).pipe(
map((response: Event<any>) => response.payload)
);
}
export function tauriEmit(emitterName: string, payload: any) {
return from(emit(emitterName, payload));
}

最新更新