rust Tauri:将listen(eventName,handler)转换为要在Angular中处理的Observable

z9gpfhce  于 2022-11-12  发布在  Angular
关注(0)|答案(2)|浏览(228)

如果你使用JS,文档工作得很好。但是在Angular 的情况下,我更喜欢处理可观察的而不是承诺。问题是这种承诺有一个处理程序。我尝试了下面列出的许多方法,但似乎都不起作用。
第一个
有人知道如何将这种事件转换为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);
    });
  }
ct2axkht

ct2axkht1#

您必须使用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被取消订阅时被调用。

hfsqlsce

hfsqlsce2#

感谢@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));
}

相关问题