Skip to content

逻辑开发指南

1. 初始化逻辑

创建依赖库之后, 执行 lcap create 命令可选择创建逻辑:

创建逻辑时,需要设置逻辑名称(逻辑使⽤小驼峰的⽅式命名,如demoLogic),逻辑别名以及逻辑的适用终端,默认选择为PC端。如下:

逻辑目录

- logics
    ---- index.ts      # index.ts export 函数

2. 编写逻辑

typescript
import '@nasl/types';

/**
 * @NaslLogic
 * @title 过滤列表
 * @desc 过滤列表中的 null 数据
 * @param list 列表
 * @returns 列表
 */
export function filterNull<T>(list: nasl.collection.List<T>): nasl.collection.List<T> {
  return list.filter(n => !!n);
}

/**
 * @NaslLogic
 * @title 并发执行异步任务
 * @description 并发执行异步任务
 * @param count 并发支持任务数量
 * @param task  并发任务列表
 */
export async function asyncExecuteTask(count: nasl.core.Integer, ...taskList: nasl.collection.List<() => nasl.core.Any>): Promise<nasl.collection.List<nasl.core.Any>> {
  const asyncTaskCount = count || 5;
  let waitExecuteTasks = [...taskList];
  const results: nasl.collection.List<nasl.core.Any> = [];
  while (waitExecuteTasks.length > 0) {
    let executeTasks;
    if (taskList.length > asyncTaskCount) {
      executeTasks = waitExecuteTasks.slice(0, asyncTaskCount);
    } else {
      executeTasks = waitExecuteTasks;
    }

    results.push(...(await Promise.all(executeTasks.map((fn) => Promise.resolve(fn())))));
    waitExecuteTasks = waitExecuteTasks.slice(executeTasks.length);
  }

  return results;
}

逻辑编写规范

  • 需要使用 nasl 提供的类型来进行定义

  • 使用 JSDoc @NaslLogic 注释来标识是需要接入平台的函数,其他注解来描述该逻辑

    • @type 绑定端 pch5both
    • @title 逻辑标题
    • @description 逻辑描述
    • @typeParam 类型描述
    • @param 参数描述,(设置了参数名称会根据名称匹配,默认根据参数index 匹配)
    • @returns 返回值描述

支持可变参数

开发依赖库逻辑支持使用可变参数,调用逻辑时可灵活添加入参。环境要求:IDE版本为3.8及以上版本,node >= 18,lcap 版本 > 0.4.x。

代码示例

该方法的入参使用可变参数String... str,可接收若干个String类型的参数,返回参数拼接结果。

typescript
/**
 * @NaslLogic
 * @title 字符串拼接
 * @desc 可变参数示例-拼接字符串返回String
 * @param str 字符串
 * @returns 字符串拼接结果
 */
export function concatenateStrings(...args: nasl.collection.List<nasl.core.String>): nasl.core.String {
    return args.join("");
}

效果演示

在平台IDE中使用该依赖库逻辑时,可点击【添加可变参数】按钮,追加一个输入参数。

返回结果示例:ABC

注意事项

  • 可变参数可以和泛型、高阶函数混合使用。
  • 可变参数的本质是数组。
  • 可变参数必须作为方法的最后一个参数。
  • 可变参数只能出现一次。例如该方法是不合法的:
typescript
export function concatenateStrings(...args: nasl.collection.List<nasl.core.String>,...strs: nasl.collection.List<nasl.core.Integer>): nasl.core.String {

}

支持泛型

开发依赖库逻辑支持逻辑的入参和返回值使用泛型,可以更灵活地编写通用代码。环境要求:IDE版本为3.8及以上版本,node >= 18,lcap 版本 > 0.4.x。

代码示例

入参中使用泛型类型,返回值也使用该类型。当入参为List时,在平台IDE中调用该逻辑时可选择数据类型为List。

typescript
/**
 * @NaslLogic
 * @title 过滤列表
 * @desc 泛型示例-过滤列表中的 null 数据
 * @param list 列表
 * @returns 列表
 */
export function filterNull<T>(list: nasl.collection.List<T>): nasl.collection.List<T> {
    return list.filter(n => !!n);
}

效果演示

注意事项

  • 泛型可以和高阶函数、可变参数混合使用。

支持高阶函数

开发依赖库逻辑支持高阶函数,编写声明为逻辑的方法时,允许使用其他函数作为入参,在平台IDE中使用该依赖库逻辑时,可将其他逻辑作为依赖库逻辑的入参。环境要求:IDE版本为3.8及以上版本,node >= 18,lcap 版本 > 0.4.x。

代码示例

typescript
/**
 * @NaslLogic
 * @title 并发执行异步任务
 * @description 高阶函数示例-并发执行异步任务
 * @param count 一次并发支持任务数量
 * @param task  并发任务列表
 */
export async function asyncExecuteTask<T>(count: nasl.core.Integer, ...taskList: nasl.collection.List<() => Promise<T>>): Promise<nasl.collection.List<T>> {
    const asyncTaskCount = count || 5;
    let waitExecuteTasks = [...taskList];
    const results: nasl.collection.List<T> = [];
    while (waitExecuteTasks.length > 0) {
        let executeTasks;
        if (taskList.length > asyncTaskCount) {
            executeTasks = waitExecuteTasks.slice(0, asyncTaskCount);
        } else {
            executeTasks = waitExecuteTasks;
        }

        results.push(...(await Promise.all(executeTasks.map((fn) => Promise.resolve(fn())))));
        waitExecuteTasks = waitExecuteTasks.slice(executeTasks.length);
    }

    return results;
}

效果演示

可添加子逻辑作为入参。

子逻辑是定义在逻辑内部的逻辑,需要将逻辑作为入参时可快捷创建子逻辑并进行修改。子逻辑可以使用父逻辑中的局部变量。

注意事项

  • 高阶函数可以和可变参数、泛型混合使用。