@taicode/common-base 1.7.2 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/output/flow-queue/flow-queue.d.ts +486 -0
- package/output/flow-queue/flow-queue.d.ts.map +1 -0
- package/output/flow-queue/flow-queue.js +655 -0
- package/output/flow-queue/flow-queue.test.d.ts +2 -0
- package/output/flow-queue/flow-queue.test.d.ts.map +1 -0
- package/output/flow-queue/flow-queue.test.js +1204 -0
- package/output/flow-queue/index.d.ts +3 -0
- package/output/flow-queue/index.d.ts.map +1 -0
- package/output/flow-queue/index.js +3 -0
- package/output/index.d.ts +1 -0
- package/output/index.d.ts.map +1 -1
- package/output/index.js +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowQueue 流式队列处理器
|
|
3
|
+
*
|
|
4
|
+
* 一个支持异步处理、错误重试、延迟执行的队列管理工具,特别适用于以下场景:
|
|
5
|
+
*
|
|
6
|
+
* ## 使用场景
|
|
7
|
+
*
|
|
8
|
+
* ### 1. 复杂嵌套的解耦
|
|
9
|
+
* 当需要处理复杂的嵌套数据结构或多层依赖关系时,FlowQueue 可以帮助解耦处理逻辑:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // 示例:处理嵌套的文件目录结构
|
|
13
|
+
* interface FileNode {
|
|
14
|
+
* path: string;
|
|
15
|
+
* children?: FileNode[];
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* const queue = new FlowQueue<FileNode, ProcessedFile>(
|
|
19
|
+
* { delay: { base: 100 } }, // 避免过快处理导致资源竞争
|
|
20
|
+
* async (node) => {
|
|
21
|
+
* // 处理当前文件节点
|
|
22
|
+
* const result = await processFile(node.path);
|
|
23
|
+
*
|
|
24
|
+
* // 将子节点加入队列,实现解耦
|
|
25
|
+
* if (node.children) {
|
|
26
|
+
* queue.input(...node.children);
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* return result;
|
|
30
|
+
* }
|
|
31
|
+
* );
|
|
32
|
+
*
|
|
33
|
+
* // 开始处理根节点
|
|
34
|
+
* queue.input(rootNode);
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* ### 2. 深度循环的解耦
|
|
38
|
+
* 在需要处理大量数据或深度递归时,FlowQueue 可以避免调用栈溢出和阻塞主线程:
|
|
39
|
+
*
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // 示例:大数据集的分批处理
|
|
42
|
+
* interface DataChunk {
|
|
43
|
+
* data: any[];
|
|
44
|
+
* offset: number;
|
|
45
|
+
* total: number;
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* const queue = new FlowQueue<DataChunk, ProcessedChunk>(
|
|
49
|
+
* {
|
|
50
|
+
* delay: { base: 50, jitter: true }, // 避免连续处理导致的性能问题
|
|
51
|
+
* retry: { strategy: 'exponential', baseDelay: 1000, maxRetries: 3 }
|
|
52
|
+
* },
|
|
53
|
+
* async (chunk) => {
|
|
54
|
+
* const result = await processDataChunk(chunk.data);
|
|
55
|
+
*
|
|
56
|
+
* // 如果还有更多数据,继续加入队列
|
|
57
|
+
* if (chunk.offset + chunk.data.length < chunk.total) {
|
|
58
|
+
* const nextChunk = await loadNextChunk(chunk.offset + chunk.data.length);
|
|
59
|
+
* queue.input(nextChunk);
|
|
60
|
+
* }
|
|
61
|
+
*
|
|
62
|
+
* return result;
|
|
63
|
+
* }
|
|
64
|
+
* );
|
|
65
|
+
*
|
|
66
|
+
* // 监听处理进度
|
|
67
|
+
* queue.onGenerate((result) => {
|
|
68
|
+
* updateProgress(result);
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* ## 关键特性
|
|
73
|
+
* - **异步解耦**:通过队列机制避免深度递归和调用栈溢出
|
|
74
|
+
* - **错误重试**:支持多种重试策略,提高处理的可靠性
|
|
75
|
+
* - **流量控制**:可配置任务间延迟,避免资源竞争
|
|
76
|
+
* - **状态追踪**:清晰的成功/失败状态管理
|
|
77
|
+
* - **背压处理**:避免内存溢出的队列管理
|
|
78
|
+
* - **并发控制**:支持配置并发处理数量,默认为 1
|
|
79
|
+
* - **链式调用**:支持流畅的链式 API 调用
|
|
80
|
+
*/
|
|
81
|
+
type FlowQueueInput = {};
|
|
82
|
+
type FlowQueueOutput = {};
|
|
83
|
+
export type FlowQueueOnGenerate<T> = (item: T) => void;
|
|
84
|
+
export type FlowQueueProcessor<I extends FlowQueueInput = FlowQueueInput, O extends FlowQueueOutput = FlowQueueOutput> = (input: I) => Promise<O>;
|
|
85
|
+
/**
|
|
86
|
+
* FlowQueue 重试策略枚举
|
|
87
|
+
*
|
|
88
|
+
* 在处理复杂嵌套结构和深度循环时,不同的重试策略适用于不同场景:
|
|
89
|
+
* - immediate: 立即重试,适用于临时性错误
|
|
90
|
+
* - exponential: 指数退避,适用于资源竞争或外部服务限流
|
|
91
|
+
* - fixed: 固定延迟,适用于已知的处理间隔需求
|
|
92
|
+
* - linear: 线性增长,适用于逐步增加等待时间的场景
|
|
93
|
+
* - custom: 自定义策略,适用于特殊的业务逻辑需求
|
|
94
|
+
*/
|
|
95
|
+
export type FlowQueueRetryStrategy = 'immediate' | 'exponential' | 'fixed' | 'linear' | 'custom';
|
|
96
|
+
type FlowQueueRetryConfigBase = {
|
|
97
|
+
maxRetries?: number;
|
|
98
|
+
jitter?: boolean;
|
|
99
|
+
};
|
|
100
|
+
type FlowQueueRetryConfigImmediate = FlowQueueRetryConfigBase & {
|
|
101
|
+
strategy?: 'immediate';
|
|
102
|
+
};
|
|
103
|
+
type FlowQueueRetryConfigFixed = FlowQueueRetryConfigBase & {
|
|
104
|
+
strategy: 'fixed';
|
|
105
|
+
baseDelay: number;
|
|
106
|
+
maxDelay?: number;
|
|
107
|
+
};
|
|
108
|
+
type FlowQueueRetryConfigExponential = FlowQueueRetryConfigBase & {
|
|
109
|
+
strategy: 'exponential';
|
|
110
|
+
baseDelay: number;
|
|
111
|
+
multiplier?: number;
|
|
112
|
+
maxDelay?: number;
|
|
113
|
+
};
|
|
114
|
+
type FlowQueueRetryConfigLinear = FlowQueueRetryConfigBase & {
|
|
115
|
+
strategy: 'linear';
|
|
116
|
+
baseDelay: number;
|
|
117
|
+
maxDelay?: number;
|
|
118
|
+
};
|
|
119
|
+
type FlowQueueRetryConfigCustom = FlowQueueRetryConfigBase & {
|
|
120
|
+
strategy: 'custom';
|
|
121
|
+
maxDelay?: number;
|
|
122
|
+
baseDelay?: number;
|
|
123
|
+
customDelayFn: (retryCount: number, baseDelay: number) => number;
|
|
124
|
+
};
|
|
125
|
+
export type FlowQueueRetryConfig = FlowQueueRetryConfigImmediate | FlowQueueRetryConfigFixed | FlowQueueRetryConfigExponential | FlowQueueRetryConfigLinear | FlowQueueRetryConfigCustom;
|
|
126
|
+
/**
|
|
127
|
+
* 任务间延迟配置
|
|
128
|
+
*
|
|
129
|
+
* 在深度循环解耦场景中,合理的延迟配置可以:
|
|
130
|
+
* - 避免过快处理导致的资源竞争
|
|
131
|
+
* - 防止阻塞主线程影响用户体验
|
|
132
|
+
* - 通过抖动减少系统负载峰值
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* // 适用于 CPU 密集型任务的配置
|
|
137
|
+
* const delayConfig = {
|
|
138
|
+
* base: 50, // 基础延迟 50ms
|
|
139
|
+
* jitter: true, // 启用抖动
|
|
140
|
+
* jitterRange: 0.2, // 20% 的抖动范围
|
|
141
|
+
* };
|
|
142
|
+
*
|
|
143
|
+
* // 适用于 I/O 密集型任务的配置
|
|
144
|
+
* const ioDelayConfig = {
|
|
145
|
+
* base: 100,
|
|
146
|
+
* customDelayFn: () => {
|
|
147
|
+
* // 根据系统负载动态调整延迟
|
|
148
|
+
* return getCurrentSystemLoad() > 80 ? 200 : 50;
|
|
149
|
+
* }
|
|
150
|
+
* };
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export type FlowQueueDelayConfig = {
|
|
154
|
+
base?: number;
|
|
155
|
+
jitter?: boolean;
|
|
156
|
+
jitterRange?: number;
|
|
157
|
+
customDelayFn?: () => number;
|
|
158
|
+
};
|
|
159
|
+
export type FlowQueueOptions = {
|
|
160
|
+
retry?: FlowQueueRetryConfig;
|
|
161
|
+
delay?: FlowQueueDelayConfig;
|
|
162
|
+
concurrency?: number;
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* FlowQueue 流式队列处理器类
|
|
166
|
+
*
|
|
167
|
+
* 提供高效的异步队列处理能力,特别适用于需要解耦复杂嵌套结构和深度循环的场景。
|
|
168
|
+
*
|
|
169
|
+
* @template I 输入数据类型,继承自 FlowQueueInput
|
|
170
|
+
* @template O 输出数据类型,继承自 FlowQueueOutput
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* // 创建队列实例
|
|
175
|
+
* const queue = new FlowQueue<InputType, OutputType>(
|
|
176
|
+
* {
|
|
177
|
+
* retry: { strategy: 'exponential', baseDelay: 1000, maxRetries: 3 },
|
|
178
|
+
* delay: { base: 100, jitter: true },
|
|
179
|
+
* concurrency: 3 // 支持 3 个并发处理
|
|
180
|
+
* },
|
|
181
|
+
* async (input) => {
|
|
182
|
+
* // 处理逻辑
|
|
183
|
+
* return await processInput(input);
|
|
184
|
+
* }
|
|
185
|
+
* );
|
|
186
|
+
*
|
|
187
|
+
* // 传统方式
|
|
188
|
+
* queue.input(data1, data2, data3);
|
|
189
|
+
* queue.onGenerate(result => console.log('处理完成:', result));
|
|
190
|
+
* queue.closeInput();
|
|
191
|
+
* await queue.awaitCompletion();
|
|
192
|
+
*
|
|
193
|
+
* // 链式调用方式
|
|
194
|
+
* await queue
|
|
195
|
+
* .input(data1, data2)
|
|
196
|
+
* .input(data3)
|
|
197
|
+
* .closeInput()
|
|
198
|
+
* .awaitCompletion();
|
|
199
|
+
*
|
|
200
|
+
* // 重置并重新开始
|
|
201
|
+
* await queue
|
|
202
|
+
* .reset()
|
|
203
|
+
* .input(newData1, newData2)
|
|
204
|
+
* .closeInput()
|
|
205
|
+
* .awaitCompletion();
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
export declare class FlowQueue<I extends FlowQueueInput, O extends FlowQueueOutput> {
|
|
209
|
+
private options;
|
|
210
|
+
private processor;
|
|
211
|
+
private pendingInputs;
|
|
212
|
+
private processedInputs;
|
|
213
|
+
successOutputs: Map<I, O>;
|
|
214
|
+
erroredOutputs: Map<I, unknown>;
|
|
215
|
+
private processingCount;
|
|
216
|
+
private retryCount;
|
|
217
|
+
private onGenerates;
|
|
218
|
+
private isInputClosed;
|
|
219
|
+
private completionPromise;
|
|
220
|
+
private completionResolve;
|
|
221
|
+
/**
|
|
222
|
+
* 创建 FlowQueue 实例
|
|
223
|
+
*
|
|
224
|
+
* @param options 队列配置选项
|
|
225
|
+
* @param processor 处理函数,接收输入并返回处理结果的 Promise
|
|
226
|
+
*
|
|
227
|
+
* processor 函数是解耦的核心:
|
|
228
|
+
* - 可以在处理过程中通过 this.input() 动态添加新任务
|
|
229
|
+
* - 支持异步处理,避免阻塞主线程
|
|
230
|
+
* - 失败时会根据重试策略自动重试
|
|
231
|
+
* - 支持并发处理,默认并发数为 1
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* // 处理嵌套文件结构的示例(单线程)
|
|
236
|
+
* const fileQueue = new FlowQueue<FileNode, ProcessedFile>(
|
|
237
|
+
* {
|
|
238
|
+
* retry: { strategy: 'exponential', baseDelay: 1000, maxRetries: 3 },
|
|
239
|
+
* delay: { base: 100, jitter: true },
|
|
240
|
+
* concurrency: 1 // 默认值,可省略
|
|
241
|
+
* },
|
|
242
|
+
* async (node) => {
|
|
243
|
+
* try {
|
|
244
|
+
* const result = await processFile(node.path);
|
|
245
|
+
*
|
|
246
|
+
* // 动态添加子节点,实现深度优先遍历的解耦
|
|
247
|
+
* if (node.children) {
|
|
248
|
+
* fileQueue.input(...node.children);
|
|
249
|
+
* }
|
|
250
|
+
*
|
|
251
|
+
* return result;
|
|
252
|
+
* } catch (error) {
|
|
253
|
+
* throw new Error(`处理文件 ${node.path} 失败: ${error.message}`);
|
|
254
|
+
* }
|
|
255
|
+
* }
|
|
256
|
+
* );
|
|
257
|
+
*
|
|
258
|
+
* // 并发处理示例
|
|
259
|
+
* const concurrentQueue = new FlowQueue<Task, Result>(
|
|
260
|
+
* {
|
|
261
|
+
* concurrency: 5, // 同时处理 5 个任务
|
|
262
|
+
* retry: { strategy: 'exponential', baseDelay: 1000, maxRetries: 3 }
|
|
263
|
+
* },
|
|
264
|
+
* async (task) => {
|
|
265
|
+
* return await processTask(task);
|
|
266
|
+
* }
|
|
267
|
+
* );
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
constructor(options: FlowQueueOptions, processor: FlowQueueProcessor<I, O>);
|
|
271
|
+
/**
|
|
272
|
+
* 计算重试延迟时间
|
|
273
|
+
*/
|
|
274
|
+
private calculateRetryDelay;
|
|
275
|
+
/**
|
|
276
|
+
* 计算任务间延迟时间
|
|
277
|
+
*/
|
|
278
|
+
private calculateTaskDelay;
|
|
279
|
+
/**
|
|
280
|
+
* 调度下一个处理任务
|
|
281
|
+
*/
|
|
282
|
+
private scheduleNextProcessing;
|
|
283
|
+
/**
|
|
284
|
+
* 延迟执行重试
|
|
285
|
+
*/
|
|
286
|
+
private scheduleRetry;
|
|
287
|
+
/**
|
|
288
|
+
* 检查是否已完成并触发完成回调
|
|
289
|
+
*/
|
|
290
|
+
private checkAndTriggerCompletion;
|
|
291
|
+
/**
|
|
292
|
+
* 检查当前的待处理队列,取出一个进行处理
|
|
293
|
+
* 处理完成后更新 output 并将输入移动到 processedInputs
|
|
294
|
+
* 当 processor 处理失败时,将错误信息存入 output(FlowError)
|
|
295
|
+
* 可以设置失败的重试次数,如果超过最大重试次数则不再重试
|
|
296
|
+
*/
|
|
297
|
+
private processFlow;
|
|
298
|
+
/**
|
|
299
|
+
* 通知所有注册的回调函数
|
|
300
|
+
*/
|
|
301
|
+
private notifyOnGenerates;
|
|
302
|
+
/**
|
|
303
|
+
* 向队列添加输入数据
|
|
304
|
+
*
|
|
305
|
+
* 此方法是解耦复杂嵌套结构的关键:
|
|
306
|
+
* - 在 processor 函数内部可以动态添加新的输入
|
|
307
|
+
* - 避免了深度递归调用栈
|
|
308
|
+
* - 支持批量添加多个输入
|
|
309
|
+
* - 支持链式调用
|
|
310
|
+
*
|
|
311
|
+
* @param inputs 要处理的输入数据
|
|
312
|
+
* @returns 返回 FlowQueue 实例以支持链式调用
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
* ```typescript
|
|
316
|
+
* // 在处理器中动态添加子任务
|
|
317
|
+
* const processor = async (node: TreeNode) => {
|
|
318
|
+
* const result = await processNode(node);
|
|
319
|
+
*
|
|
320
|
+
* // 将子节点加入队列,实现解耦
|
|
321
|
+
* if (node.children) {
|
|
322
|
+
* queue.input(...node.children);
|
|
323
|
+
* }
|
|
324
|
+
*
|
|
325
|
+
* return result;
|
|
326
|
+
* };
|
|
327
|
+
*
|
|
328
|
+
* // 链式调用示例
|
|
329
|
+
* queue
|
|
330
|
+
* .input(data1, data2)
|
|
331
|
+
* .input(data3)
|
|
332
|
+
* .closeInput();
|
|
333
|
+
* ```
|
|
334
|
+
*/
|
|
335
|
+
input(...inputs: I[]): FlowQueue<I, O>;
|
|
336
|
+
/**
|
|
337
|
+
* 注册输出监听器
|
|
338
|
+
*
|
|
339
|
+
* 用于监听每个成功处理的输出,适用于:
|
|
340
|
+
* - 实时更新处理进度
|
|
341
|
+
* - 流式处理大数据集
|
|
342
|
+
* - 实现观察者模式解耦
|
|
343
|
+
*
|
|
344
|
+
* @param callback 当有新输出时调用的回调函数
|
|
345
|
+
* @returns 取消监听的函数
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* // 监听处理进度
|
|
350
|
+
* const unsubscribe = queue.onGenerate((result) => {
|
|
351
|
+
* updateProgressBar(result);
|
|
352
|
+
* saveToDatabase(result);
|
|
353
|
+
* });
|
|
354
|
+
*
|
|
355
|
+
* // 在适当时机取消监听
|
|
356
|
+
* unsubscribe();
|
|
357
|
+
* ```
|
|
358
|
+
*/
|
|
359
|
+
onGenerate(callback: FlowQueueOnGenerate<O>): () => void;
|
|
360
|
+
/**
|
|
361
|
+
* 只读标记,代表是否当前已经 closeInput 并且所有输入都已经处理完毕
|
|
362
|
+
*/
|
|
363
|
+
get isCompleted(): boolean;
|
|
364
|
+
/**
|
|
365
|
+
* 标记当前 FlowQueue 不会再有新的输入了
|
|
366
|
+
*
|
|
367
|
+
* 调用此方法后:
|
|
368
|
+
* - 队列将不再接受新的输入
|
|
369
|
+
* - 当所有现有输入处理完成后,队列将进入完成状态
|
|
370
|
+
* - 可以通过 awaitCompletion() 等待所有处理完成
|
|
371
|
+
* - 支持链式调用
|
|
372
|
+
*
|
|
373
|
+
* 在深度循环解耦场景中,这是控制处理边界的重要方法。
|
|
374
|
+
*
|
|
375
|
+
* @returns 返回 FlowQueue 实例以支持链式调用
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* // 添加所有初始数据
|
|
380
|
+
* queue.input(...initialData);
|
|
381
|
+
*
|
|
382
|
+
* // 标记输入结束
|
|
383
|
+
* queue.closeInput();
|
|
384
|
+
*
|
|
385
|
+
* // 等待所有处理完成
|
|
386
|
+
* await queue.awaitCompletion();
|
|
387
|
+
* console.log('所有数据处理完成');
|
|
388
|
+
*
|
|
389
|
+
* // 链式调用示例
|
|
390
|
+
* await queue
|
|
391
|
+
* .input(data1, data2)
|
|
392
|
+
* .closeInput()
|
|
393
|
+
* .awaitCompletion();
|
|
394
|
+
* ```
|
|
395
|
+
*/
|
|
396
|
+
closeInput(): FlowQueue<I, O>;
|
|
397
|
+
/**
|
|
398
|
+
* 返回一个 Promise,代表当前已经标记为输入关闭状态、所有输入都已经处理完毕
|
|
399
|
+
*
|
|
400
|
+
* 这是等待所有异步处理完成的最佳方式,特别适用于:
|
|
401
|
+
* - 等待深度循环处理完成
|
|
402
|
+
* - 确保所有嵌套任务都已处理
|
|
403
|
+
* - 在测试中等待异步操作完成
|
|
404
|
+
*
|
|
405
|
+
* @returns Promise,在所有输入处理完成时 resolve
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* ```typescript
|
|
409
|
+
* // 处理大量嵌套数据
|
|
410
|
+
* queue.input(rootData);
|
|
411
|
+
* queue.closeInput();
|
|
412
|
+
*
|
|
413
|
+
* // 等待所有嵌套处理完成
|
|
414
|
+
* await queue.awaitCompletion();
|
|
415
|
+
*
|
|
416
|
+
* // 检查处理结果
|
|
417
|
+
* console.log('成功处理:', queue.successOutputs.size);
|
|
418
|
+
* console.log('处理失败:', queue.erroredOutputs.size);
|
|
419
|
+
* ```
|
|
420
|
+
*/
|
|
421
|
+
awaitCompletion(): Promise<void>;
|
|
422
|
+
/**
|
|
423
|
+
* 移除尚未处理的输入并调用 closeInput
|
|
424
|
+
*
|
|
425
|
+
* @returns 返回 FlowQueue 实例以支持链式调用
|
|
426
|
+
*
|
|
427
|
+
* @example
|
|
428
|
+
* ```typescript
|
|
429
|
+
* // 链式调用示例
|
|
430
|
+
* queue
|
|
431
|
+
* .input(data1, data2)
|
|
432
|
+
* .cancel()
|
|
433
|
+
* .reset();
|
|
434
|
+
* ```
|
|
435
|
+
*/
|
|
436
|
+
cancel(): FlowQueue<I, O>;
|
|
437
|
+
/**
|
|
438
|
+
* 重置 FlowQueue 到初始状态
|
|
439
|
+
* 清空所有数据,包括待处理、已处理、输出、重试计数等
|
|
440
|
+
* 重置后可以重新开始处理
|
|
441
|
+
*
|
|
442
|
+
* @returns 返回 FlowQueue 实例以支持链式调用
|
|
443
|
+
*
|
|
444
|
+
* @example
|
|
445
|
+
* ```typescript
|
|
446
|
+
* // 链式调用示例
|
|
447
|
+
* queue
|
|
448
|
+
* .reset()
|
|
449
|
+
* .input(newData1, newData2)
|
|
450
|
+
* .closeInput();
|
|
451
|
+
* ```
|
|
452
|
+
*/
|
|
453
|
+
reset(): FlowQueue<I, O>;
|
|
454
|
+
/**
|
|
455
|
+
* 重试所有失败的输入
|
|
456
|
+
*
|
|
457
|
+
* 自动将所有失败的输入从已处理队列移回待处理队列,并启动处理。
|
|
458
|
+
* 在处理复杂嵌套结构时,某些节点可能因为依赖关系而暂时失败,
|
|
459
|
+
* 此方法可以在依赖解决后重新处理这些失败的节点。
|
|
460
|
+
*
|
|
461
|
+
* @returns 被移动到待处理队列的输入数量
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```typescript
|
|
465
|
+
* // 第一轮处理
|
|
466
|
+
* queue.input(...allData);
|
|
467
|
+
* queue.closeInput();
|
|
468
|
+
* await queue.awaitCompletion();
|
|
469
|
+
*
|
|
470
|
+
* // 检查是否有失败的项
|
|
471
|
+
* if (queue.erroredOutputs.size > 0) {
|
|
472
|
+
* console.log(`有 ${queue.erroredOutputs.size} 个项目处理失败`);
|
|
473
|
+
*
|
|
474
|
+
* // 重试失败的项目
|
|
475
|
+
* const retryCount = queue.retry();
|
|
476
|
+
* console.log(`重试 ${retryCount} 个项目`);
|
|
477
|
+
*
|
|
478
|
+
* // 等待重试完成
|
|
479
|
+
* await queue.awaitCompletion();
|
|
480
|
+
* }
|
|
481
|
+
* ```
|
|
482
|
+
*/
|
|
483
|
+
retry(): number;
|
|
484
|
+
}
|
|
485
|
+
export {};
|
|
486
|
+
//# sourceMappingURL=flow-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-queue.d.ts","sourceRoot":"","sources":["../../source/flow-queue/flow-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AAQH,KAAK,cAAc,GAAG,EAAE,CAAA;AACxB,KAAK,eAAe,GAAG,EAAE,CAAA;AACzB,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AACtD,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAEjJ;;;;;;;;;GASG;AACH,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,aAAa,GACb,OAAO,GACP,QAAQ,GACR,QAAQ,CAAA;AAGZ,KAAK,wBAAwB,GAAG;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAGD,KAAK,6BAA6B,GAAG,wBAAwB,GAAG;IAC9D,QAAQ,CAAC,EAAE,WAAW,CAAA;CACvB,CAAA;AAGD,KAAK,yBAAyB,GAAG,wBAAwB,GAAG;IAC1D,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAGD,KAAK,+BAA+B,GAAG,wBAAwB,GAAG;IAChE,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAGD,KAAK,0BAA0B,GAAG,wBAAwB,GAAG;IAC3D,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAGD,KAAK,0BAA0B,GAAG,wBAAwB,GAAG;IAC3D,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;CACjE,CAAA;AAGD,MAAM,MAAM,oBAAoB,GAC5B,6BAA6B,GAC7B,yBAAyB,GACzB,+BAA+B,GAC/B,0BAA0B,GAC1B,0BAA0B,CAAA;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,oBAAoB,CAAA;IAC5B,KAAK,CAAC,EAAE,oBAAoB,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,eAAe;IAiE5D,OAAO,CAAC,OAAO;IAAoB,OAAO,CAAC,SAAS;IAhEhE,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAU;IAE1B,cAAc,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAY;IACrC,cAAc,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAY;IAElD,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,UAAU,CAA4B;IAE9C,OAAO,CAAC,WAAW,CAAiD;IAEpE,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,iBAAiB,CAA4B;IAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;gBACiB,OAAO,EAAE,gBAAgB,EAAU,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAgB1F;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsD3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;YACW,yBAAyB;IAQvC;;;;;OAKG;YACW,WAAW;IA0DzB;;OAEG;YACW,iBAAiB;IAS/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAOtC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,UAAU,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAMxD;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,UAAU,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAO7B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBhC;;;;;;;;;;;;;OAaG;IACH,MAAM,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAYzB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAsBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,IAAI,MAAM;CA+BhB"}
|