Skip to content

服务事件

API 里的几乎所有的服务都是 `Eventable`` 的。这意味着每个服务都会在不同时机触发一些事件。在其他代码位置、进程可以监听对应的事件触发,来执行自己的代码。比如你可以监听用户选择的论文变化了,然后运行你的方法等等。

监听事件

监听事件的方法是 on,它接受两个参数,第一个是事件名,第二个是回调函数。回调函数的参数是事件触发时传递的参数。

typescript
import { PLAPI } from 'paperlib-api/api';


PLAPI.serviceName.on('event-id', (newValue: {key: string, value: any}) => {
    ...
});

回调函数接收的参数通常是一个对象,包含了 keyvalue 两个字段。key 是事件 ID,value 是对应的新值。

你可以给多个事件注册同一个回调函数:

typescript
PLAPI.serviceName.on(
    ['event-id-1', 'event-id-2'],
    (newValue: {key: string, value: any}) => {
    ...
    }
);

此时,key 字段将会有助于你判断是哪个事件触发了。

在监听事件回调中,不要使用 floating promise,即,如果你的回调函数中包含 AsyncFunction,请务必 await,或者 .catch 异常。因为 floating promise 中的异常无法在 Paperlib 中被捕获,会导致插件崩溃:

typescript
// 永远不要做如下:
PLAPI.serviceName.on('event-id', (newValue: {key: string, value: any}) => {
    asyncFunction();
});

async function asyncFunction() {
    throw new Error('error'); // 这个错误将无法被 Paperlib 捕获,会导致插件崩溃。
}

取消监听

请注意,你需要保存 on 方法返回的函数,以便在不需要监听时取消监听。

typescript
const cancel = PLAPI.serviceName.on('event-id', (newValue: {key: string, value: any}) => {
    ...
});

// 取消监听
cancel();

监听别名

对于部分服务,我们提供了一些 on() 函数的别名,以便更舒服地编写代码。

比如,在 preferenceService 中,我们提供 onChanged() 方法,它的效果和 on() 一样,仅仅只是一个别名。

事件列表

不同的服务有不同的事件,具体的事件列表请参考对应的服务文档。

Created by Future Scholars. Contact: hi@paperlib.app