1
1
import { asyncBatchCrawl , syncBatchCrawl } from './batchCrawlHandle'
2
- import { IntervalTime } from './types/api'
2
+ import { priorityQueueMergeSort } from './sort'
3
+ import {
4
+ IntervalTime ,
5
+ LoaderDataRequestConfig ,
6
+ LoaderFileRequestConfig ,
7
+ LoaderPageRequestConfig
8
+ } from './types/api'
3
9
import { log , logError , logNumber , logSuccess , logWarn } from './utils'
4
10
5
- export interface ControllerConfig < T , V > {
11
+ export interface ControllerConfig <
12
+ T extends
13
+ | LoaderPageRequestConfig
14
+ | LoaderDataRequestConfig
15
+ | LoaderFileRequestConfig ,
16
+ V
17
+ > {
6
18
id : number
7
19
isSuccess : boolean
8
20
crawlCount : number
@@ -12,7 +24,14 @@ export interface ControllerConfig<T, V> {
12
24
crawlSingleRes : V | null
13
25
}
14
26
15
- export async function controller < T extends { maxRetry : number } , V , C > (
27
+ export async function controller <
28
+ T extends
29
+ | LoaderPageRequestConfig
30
+ | LoaderDataRequestConfig
31
+ | LoaderFileRequestConfig ,
32
+ V ,
33
+ C
34
+ > (
16
35
name : 'page' | 'data' | 'file' ,
17
36
mode : 'async' | 'sync' ,
18
37
requestConfigs : T [ ] ,
@@ -23,8 +42,21 @@ export async function controller<T extends { maxRetry: number }, V, C>(
23
42
crawlSingleFnExtraConfig : C
24
43
) => Promise < V >
25
44
) : Promise < ControllerConfig < T , V > [ ] > {
45
+ // 是否使用优先爬取
46
+ const isPriorityCrawl = ! requestConfigs . every (
47
+ ( item ) => item . priority === requestConfigs [ 0 ] . priority
48
+ )
49
+ const targetRequestConfigs = isPriorityCrawl
50
+ ? priorityQueueMergeSort (
51
+ requestConfigs . map ( ( item ) => ( {
52
+ ...item ,
53
+ valueOf : ( ) => item . priority
54
+ } ) )
55
+ )
56
+ : requestConfigs
57
+
26
58
// 通过映射生成新的配置数组
27
- const controllerConfigs : ControllerConfig < T , V > [ ] = requestConfigs . map (
59
+ const controllerConfigs : ControllerConfig < T , V > [ ] = targetRequestConfigs . map (
28
60
( requestConfig , index ) => ( {
29
61
id : index + 1 ,
30
62
isSuccess : false ,
0 commit comments