第六章 服务

OWL中的服务定义是一段小的具有某种功能特性的常驻代码。服务可以被组件或另外一个服务引用,或者被声明为一种依赖注入。例如,通知(notification)服务提供了一种通知用户的功能,而RPC服务则提供了一种和后端接口通信的通道。

下面的代码展示了如何注册一个每间隔5秒显示一个通知的代码示例:

import { registry } from "@web/core/registry";

const myService = {
    dependencies: ["notification"],
    start(env, { notification }) {
        let counter = 1;
        setInterval(() => {
            notification.add(`Tick Tock ${counter++}`);
        }, 5000);
    }
};

registry.category("services").add("myService", myService);

WebClient在启动的时候,会自动加载所有已注册为服务(services)的服务,服务的名字即为它的注册名。

服务的结构

要声明一个服务,需要实现下面两个接口:

  • dependencies: 依赖的服务列表,可选项。
  • start(env,deps): 启动方法,接受两个参数。env:应用环境变量,deps:所有请求的依赖。start方法返回一个值或者一个Promise对象。

以上就是一个服务的主要定义,服务返回一个值或者一个Promise的对象。如果是后者,服务调用方会等待Promise执行完成,使用返回的结果作为服务的值。有些服务不会回传任何值,此时,服务的值会被设置成null。

  • async: 服务可选参数,值可选为true或string列表

有些服务会提供一个异步的API,例如RPC服务提供了一个异步的函数,而ORM服务则提供了了一系列odoo的模型方法。这种情况下,组件在调用异步方法时可能会用到即将被销毁的服务。大多数情况下,异步的调用会被忽略,但是这样做依旧是个危险的动作,因为此时依赖的组件可能已经被销毁。而async就是用来通知服务的创建者所有来自被销毁的组件的异步请求都将被挂起。

results matching ""

    No results matching ""