diff --git a/src/composables/useTeachingBook.ts b/src/composables/useTeachingBook.ts index 43d0271..932b155 100644 --- a/src/composables/useTeachingBook.ts +++ b/src/composables/useTeachingBook.ts @@ -227,8 +227,15 @@ export function useTeachingBook(bookId: string): TeachingBookStore { } } + const abortController = new AbortController() + async function runWorker(): Promise { - while (!firstError && !options.isCancelled?.()) { + while (!firstError) { + if (options.isCancelled?.()) { + abortController.abort() + return + } + const index = nextStartIndex if (index >= topics.length) return @@ -237,12 +244,13 @@ export function useTeachingBook(bookId: string): TeachingBookStore { options.onTopicStart?.(topic) try { - const result = await booksApi.generateLesson(topic) + const result = await booksApi.generateLesson(topic, abortController.signal) results[index] = removeGeneratedAdditionalContent( parseTeachingDesign(result.filename, result.markdown), ) appendReadyLessons() } catch (error) { + if (error instanceof Error && error.name === 'AbortError') return firstError = error instanceof Error ? error.message : '生成失败。' } } diff --git a/src/services/booksApi.ts b/src/services/booksApi.ts index c3aeefa..dec9c39 100644 --- a/src/services/booksApi.ts +++ b/src/services/booksApi.ts @@ -50,8 +50,8 @@ export function deleteBook(id: string): Promise<{ ok: true }> { return authedFetch(`/api/books/${id}`, { method: 'DELETE' }) } -export function generateLesson(topic: string): Promise { - return authedFetch('/api/generate', { method: 'POST', body: JSON.stringify({ topic }) }) +export function generateLesson(topic: string, signal?: AbortSignal): Promise { + return authedFetch('/api/generate', { method: 'POST', body: JSON.stringify({ topic }), signal }) } export function generateOutline(theme: string): Promise<{ titles: string[] }> {