@nativescript-use/nativescript-task
后台多进程任务
npm i --save @nativescript-use/nativescript-task

@nativescript-use/nativescript-task

npm install @nativescript-use/nativescript-task

一个用于通过 web workers 简单处理后台任务的 NativeScript 模块。

此模块将初始化一个在应用生命周期内可用的 worker,并能够在其上执行任何任务。

此库为在线 workers 提供承诺和更新。

示例

不使用依赖项

import { Task } from "@nativescript-use/nativescript-task";

// TS <number, string, boolean> = <InitialData, ReturnData, OnProgressData>
Task.start<number, string, boolean>((ctx) => {
// ⚡ This function runs in the background
ctx.onProgressUpdate(false);
return ctx.state === 1000 ? "YES" : "NO";
}, {
state: 1000,
onProgressUpdate(update) {
console.log(update.data);
}
})
.then((result) => {
console.log('Result: ' + result.data); // "YES"
})
.catch((result) => {
console.log('ERROR: ' + result.error);
// result.state = 1000
});

使用内联函数

我们可以使用 attachToContextFunctions 添加本地函数到 worker 内部运行。

import { Task, TaskContext } from "@nativescript-use/nativescript-task";

const myFunction = (myNumber: number) => 5 + myNumber;
const myOtherFunction = (myNumber: number) => 20 + myNumber;

Task.start((ctx) => {
return myFunction(ctx.state) + myOtherFunction(ctx.state);
}, { state: 10, attachToContextFunctions: { myFunction, myOtherFunction }})

使用依赖项

我们需要定义一个包含我们希望在任务中定义的导入的 worker。我们在项目的 src|app 文件夹中定义 globalWorker.ts|js 文件,导入我们希望可用的模块,并将它们传递给此库提供的 defineWorker 函数。

// /app/globalWorker.ts
import '@nativescript/core/globals';
import { defineWorker } from "@nativescript-use/nativescript-task";

import { myUtils } from '@utils';
import { otherLib } from 'other-lib';

defineWorker({ imports: { otherLib } });

现在从上下文访问全局 worker 文件中定义的模块。

import { Task } from "@nativescript-use/nativescript-task";
import { myUtils } from '@utils';
import { otherLib } from 'other-lib';

Task.start((ctx) => {
// access imported modules
return myUtils.someFunction(1000) + otherLib.otherFunction(ctx.state);
}, { state: 1000 })
.then((result) => {
console.log('Result: ' + result.data);
})

全局配置

// app.ts | main.ts (entry file app)

import { Task } from "@nativescript-use/nativescript-task";

Task.globalWorkerConfig({
stickyWorker: true,
newWorkerIfGlobalIsUsed: true,
startGlobalWorker: true
});

// run app
  • stickyWorker - 默认 true:当设置为 true 时,插件始终保持一个 worker 运行以启动您的任务。这可以节省时间,因为初始化 worker 需要时间,默认情况下为 true 以尽可能快速地启动每个任务。如果设置为 false,则插件将初始化一个 worker 并终止每个任务。
  • newWorkerIfGlobalIsUsed - 默认 true:当 stickyWorker 为 true 且我们有一个始终运行的 worker 时,如果我们启动一个任务并且主 worker 正在运行另一个任务,将创建一个新的 worker 来启动此任务,而不是等待前一个任务完成。如果您禁用此标志并且当另一个任务正在运行时启动另一个任务,它将必须等待直到它达到队列的开始。
  • startGlobalWorker - 默认 true:在设置配置时初始化全局 worker,当您启动第一个任务时它将可用。如果禁用,则当第一个任务启动时,它将具有 worker 创建延迟。

注意:当提到 worker 执行时间时,我们是在谈论大约 200ms(这几乎什么也不是)。这不是很多,但此插件优先考虑速度,这就是为什么我们始终保持 stickyWorker 可用。

限制

  • 只能提交和返回可序列化的对象和值。
  • 所有任务函数都是 '闭包',这意味着您不能访问此类函数之外的变量。所有函数都序列化为字符串并提交给 worker 脚本,其中“外部内容”不可用!与函数共享数据的唯一方法是通过提交一个可选的可序列化的“状态值”。

阅读 官方文档 获取更多信息。

有关更多信息,您可以进入 NativeScript Discord 服务器

此插件在很大程度上基于 https://github.com/mkloubert/nativescript-tasks

许可

Apache 许可证版本 2.0

用 ❤️ 制作