npm i --save @nativescript-use/nativescript-task
- 版本:0.0.11
- GitHub: https://github.com/NativeScript-Use/NativeScript-Use
- NPM: https://npmjs.net.cn/package/%40nativescript-use%2Fnativescript-task
- 下载量
- 前一天:0
- 上周:38
- 上个月:63
@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