如果您正在使用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));
}