Skip to content

Commit 4417055

Browse files
committed
The fetchFile API uses async for save file operations and sorts errors
1 parent 6bcb172 commit 4417055

File tree

3 files changed

+40
-21
lines changed

3 files changed

+40
-21
lines changed

src/index.ts

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import fs from 'node:fs'
2+
import { writeFile } from 'node:fs/promises'
23
import path from 'node:path'
34
import { JSDOM } from 'jsdom'
45

@@ -154,6 +155,9 @@ export default class XCrawl {
154155
const { requestConifg, intervalTime, fileConfig } = this.mergeConfig(config)
155156

156157
const container: IFetchCommonArr<IFileInfo> = []
158+
const saveFileArr: Promise<void>[] = []
159+
const saveFileErrorArr: { message: string; valueOf: () => number }[] = []
160+
157161
function handleResItem(requestResItem: IRequestResItem) {
158162
const { id, headers, data } = requestResItem
159163

@@ -165,34 +169,51 @@ export default class XCrawl {
165169
`${fileName}.${fileExtension}`
166170
)
167171

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
170176

171-
const res = {
172-
...requestResItem,
173-
data: { fileName, mimeType, size: data.length, filePath }
174-
}
177+
saveFileErrorArr.push({ message, valueOf })
175178

176-
if (callback) {
177-
callback(res)
178-
}
179+
return true
180+
})
181+
.then((isError) => {
182+
if (isError) return
179183

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)
184197
}
185198

186199
await this.useBatchRequestByMode(requestConifg, intervalTime, handleResItem)
187200

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
189208
const success = container.length
190-
const error = saveTotal - success
209+
const error = saveFileTotal - success
191210
log(
192-
`saveTotal: ${logNumber(saveTotal)}, success: ${logSuccess(
211+
`saveFileTotal: ${logNumber(saveFileTotal)}, success: ${logSuccess(
193212
success
194213
)}, error: ${logError(error)}`
195214
)
215+
216+
// 排序结果
196217
const res = quickSort(
197218
container.map((item) => ({ ...item, valueOf: () => item.id }))
198219
)

src/request.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,7 @@ export async function batchRequest(
178178
let successTotal = 0
179179
let errorTotal = 0
180180
const requestQueue: Promise<void>[] = []
181-
const errorMessage: { id: number; message: string; valueOf: () => number }[] =
182-
[]
181+
const errorMessage: { message: string; valueOf: () => number }[] = []
183182
for (const requestConifg of requestConifgs) {
184183
const id = ++index
185184

@@ -195,10 +194,9 @@ export async function batchRequest(
195194
errorTotal++
196195

197196
const message = `Request ${id} is an error: ${error.message}`
198-
// valueOf 为排序做准备
199197
const valueOf = () => id
200198

201-
errorMessage.push({ id, message, valueOf })
199+
errorMessage.push({ message, valueOf })
202200
})
203201
.then((requestRes) => {
204202
if (!requestRes) return

test/start/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)