1
1
import fs from 'node:fs'
2
+ import { writeFile } from 'node:fs/promises'
2
3
import path from 'node:path'
3
4
import { JSDOM } from 'jsdom'
4
5
@@ -154,6 +155,9 @@ export default class XCrawl {
154
155
const { requestConifg, intervalTime, fileConfig } = this . mergeConfig ( config )
155
156
156
157
const container : IFetchCommonArr < IFileInfo > = [ ]
158
+ const saveFileArr : Promise < void > [ ] = [ ]
159
+ const saveFileErrorArr : { message : string ; valueOf : ( ) => number } [ ] = [ ]
160
+
157
161
function handleResItem ( requestResItem : IRequestResItem ) {
158
162
const { id, headers, data } = requestResItem
159
163
@@ -165,34 +169,51 @@ export default class XCrawl {
165
169
`${ fileName } .${ fileExtension } `
166
170
)
167
171
168
- try {
169
- fs . writeFileSync ( filePath , data )
172
+ const saveFileItem = writeFile ( filePath , data )
173
+ . catch ( ( err ) => {
174
+ const message = `File save error at id ${ id } : ${ err . message } `
175
+ const valueOf = ( ) => id
170
176
171
- const res = {
172
- ...requestResItem ,
173
- data : { fileName, mimeType, size : data . length , filePath }
174
- }
177
+ saveFileErrorArr . push ( { message, valueOf } )
175
178
176
- if ( callback ) {
177
- callback ( res )
178
- }
179
+ return true
180
+ } )
181
+ . then ( ( isError ) => {
182
+ if ( isError ) return
179
183
180
- container . push ( res )
181
- } catch ( error : any ) {
182
- log ( logError ( `File save error at id ${ id } : ${ error . message } ` ) )
183
- }
184
+ const res = {
185
+ ...requestResItem ,
186
+ data : { fileName, mimeType, size : data . length , filePath }
187
+ }
188
+
189
+ if ( callback ) {
190
+ callback ( res )
191
+ }
192
+
193
+ container . push ( res )
194
+ } )
195
+
196
+ saveFileArr . push ( saveFileItem )
184
197
}
185
198
186
199
await this . useBatchRequestByMode ( requestConifg , intervalTime , handleResItem )
187
200
188
- const saveTotal = isArray ( requestConifg ) ? requestConifg . length : 1
201
+ // 等待保存文件任务完成
202
+ await Promise . all ( saveFileArr )
203
+
204
+ // 打印保存文件的错误
205
+ quickSort ( saveFileErrorArr ) . forEach ( ( item ) => log ( logError ( item . message ) ) )
206
+
207
+ const saveFileTotal = isArray ( requestConifg ) ? requestConifg . length : 1
189
208
const success = container . length
190
- const error = saveTotal - success
209
+ const error = saveFileTotal - success
191
210
log (
192
- `saveTotal : ${ logNumber ( saveTotal ) } , success: ${ logSuccess (
211
+ `saveFileTotal : ${ logNumber ( saveFileTotal ) } , success: ${ logSuccess (
193
212
success
194
213
) } , error: ${ logError ( error ) } `
195
214
)
215
+
216
+ // 排序结果
196
217
const res = quickSort (
197
218
container . map ( ( item ) => ( { ...item , valueOf : ( ) => item . id } ) )
198
219
)
0 commit comments