taskset
v0.2.0
Published
async tasks runner
Downloads
11
Readme
taskset - 任务运行器集合
前言
安装
npm i taskset
# or
pnpm add tasksettoAsyncTaskResult
说明
/**
* @desc 通过tryCatch执行异步任务,并返回其错误和结果
* @param {function} asyncTask
* @param {any} [...args]
* @return {array} [error, result]
*/示例
import { toAsyncTaskResult } from "taskset";
const [error, result] = await toAsyncTaskResult(() => fetch("/xxx-api"));runAsyncTasksFlowWithHooks
说明
/**
* @desc runAsyncTasksFlow 的hooks版本
* @params {array<function>} tasks - 初始的异步任务流
* @params {object} hookTasks
* @params {object} [hookTasks.onError] - 任务流程报错时执行该方法; (err, ...args) => undefined
* @params {object} [hookTasks.onFinish] - 任务流程结束时执行该方法(未发生错误时); (...args) => undefined
* @params {object} [hookTasks.onStart] - 任务流程启动时执行该方法; (...args) => undefined
* @params {object} [hookTasks.onEnd] - 任务流程结束时执行该方法(无论过程成功还是失败); (...args) => undefined
* @param {array<function>} asyncTasks - 初始的异步任务列表
* @param {function|null} isBreak - 是否要中断任务列表的执行; isBreak(...args) -> boolean
* @param {any} [...args] - 任务入参列表
* @return {undefined}
*/示例
import { runAsyncTasksFlowWithHooks } from "taskset";
const refuseTask = async (req, res) => {
res.end("");
};
const notFoundTask = async (req, res) => {
res.end("Not Found");
};
const entryTask = async (req, res) => {
if (req.path.startsWith("/admin/")) {
// 通过返回一个新的任务列表进行分支选择
return [refuseTask];
} else {
return [notFoundTask];
}
};
const hookTasks = {
onStart: async (req, res) => {
req.rtime = Date.now();
},
onEnd: async (req, res) => {
console.log(req.url, Date.now() - req.rtime);
},
onFinish: async (req, res) => {
!res.headersSent && console.log("not response");
},
onError: console.error,
};
import http from "node:http";
const server = http.createServer((req, res) => {
runAsyncTasksFlow(
hookTasks,
[entryTask],
(req, res) => res.headersSent,
req,
res
);
});runAsyncTasksFlow
说明
/**
* @desc 运行一个中途可插入可中断的异步任务列表
* @param {array<function>} asyncTasks - 初始的异步任务列表
* @param {function|null} isBreak - 是否要中断任务列表的执行; isBreak(...args) -> boolean
* @param {any} [...args] - 任务入参列表
* @return {undefined}
*/示例
import { runAsyncTasksFlow } from "taskset";
const refuseTask = async (req, res) => {
res.end("");
};
const notFoundTask = async (req, res) => {
res.end("Not Found");
};
const entryTask = async (req, res) => {
if (req.path.startsWith("/admin/")) {
// 通过返回一个新的任务列表进行分支选择
return [refuseTask];
} else {
return [notFoundTask];
}
};
runAsyncTasksFlow([entryTask], (req, res) => res.headersSent, req, res);createAsyncTaskPendingHandle
说明
/**
* @desc 创建一个异步方法可pending的包装控制器
* @eg const [newAsyncTask, setPending] = createAsyncTaskPendingHandle(asyncTask)
* @param {function} - asyncTask
* @return {array<function, function, array>} - [pendingAsyncTask, setPending, pendingList]
*/示例
import { createAsyncTaskPendingHandle } from "taskset";
const [pendingFetch, setPending] = createAsyncTaskPendingHandle(window.fetch);
window.fetch = pendingFetch;
document.addEventListener("visibilitychange", () => {
const visible = document.visibilityState === "visible";
setPending(!visible);
});