Skip to content

Commit 9649696

Browse files
committed
Refactor: Use a global AbortController to cancel requests on route changes
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
1 parent ce20da5 commit 9649696

File tree

15 files changed

+114
-236
lines changed

15 files changed

+114
-236
lines changed

package-lock.json

Lines changed: 43 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"debounce": "^1.2.1",
4949
"he": "^1.2.0",
5050
"jest-environment-jsdom": "^28.1.1",
51+
"p-queue": "^7.3.0",
5152
"path-posix": "^1.0.0",
5253
"qs": "^6.11.0",
5354
"url-parse": "^1.5.10",

src/components/FaceCover.vue

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,6 @@ export default {
103103
await this.fetchFiles()
104104
},
105105
106-
beforeDestroy() {
107-
this.cancelFilesRequest('Changed view')
108-
},
109-
110106
methods: {
111107
async fetchFiles() {
112108
await this.fetchFaceContent(this.face.basename)

src/components/Folder.vue

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
import { mapGetters } from 'vuex'
3333
3434
import getAlbumContent from '../services/AlbumContent'
35-
import cancelableRequest from '../utils/CancelableRequest'
3635
import FolderTagPreview from './FolderTagPreview'
36+
import * as RequestHandler from '../services/RequestHandler'
3737
3838
export default {
3939
name: 'Folder',
@@ -52,7 +52,6 @@ export default {
5252
5353
data() {
5454
return {
55-
cancelRequest: null,
5655
previewFolder: this.item.injected.fileid,
5756
}
5857
},
@@ -101,31 +100,19 @@ export default {
101100
}
102101
},
103102
104-
beforeDestroy() {
105-
// cancel any pending requests
106-
if (this.cancelRequest) {
107-
this.cancelRequest('Navigated away')
108-
}
109-
},
110-
111103
methods: {
112104
async getFolderData(filename) {
113-
// init cancellable request
114-
const { request, cancel } = cancelableRequest(getAlbumContent)
115-
this.cancelRequest = cancel
116-
117105
try {
118106
// get data
119-
const { folder, folders, files } = await request(filename, { shared: this.item.injected.showShared })
107+
const { folder, folders, files } = await RequestHandler.queue.add(() =>
108+
getAlbumContent(filename, { shared: this.item.injected.showShared })
109+
)
120110
this.$store.dispatch('updateFolders', { fileid: folder.fileid, files, folders })
121111
this.$store.dispatch('updateFiles', { folder, files, folders })
122112
} catch (error) {
123113
if (error.response && error.response.status) {
124114
console.error('Failed to get folder content', filename, error.response)
125115
}
126-
// else we just cancelled the request
127-
} finally {
128-
this.cancelRequest = null
129116
}
130117
},
131118

src/components/Tag.vue

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
import { mapGetters } from 'vuex'
3434
3535
import getTaggedImages from '../services/TaggedImages'
36-
import cancelableRequest from '../utils/CancelableRequest'
3736
import FolderTagPreview from './FolderTagPreview'
37+
import * as RequestHandler from '../services/RequestHandler'
3838
3939
export default {
4040
name: 'Tag',
@@ -51,12 +51,6 @@ export default {
5151
},
5252
},
5353
54-
data() {
55-
return {
56-
cancelRequest: null,
57-
}
58-
},
59-
6054
computed: {
6155
// global lists
6256
...mapGetters([
@@ -78,29 +72,16 @@ export default {
7872
},
7973
},
8074
81-
beforeDestroy() {
82-
// cancel any pending requests
83-
if (this.cancelRequest) {
84-
this.cancelRequest('Navigated away')
85-
}
86-
},
87-
8875
async created() {
89-
// init cancellable request
90-
const { request, cancel } = cancelableRequest(getTaggedImages)
91-
this.cancelRequest = cancel
92-
9376
try {
9477
// get data
95-
const files = await request(this.item.injected.id)
78+
const files = await RequestHandler.queue.add(() => getTaggedImages(this.item.injected.id))
9679
this.$store.dispatch('updateTag', { id: this.item.injected.id, files })
9780
this.$store.dispatch('appendFiles', files)
9881
} catch (error) {
9982
if (error.response && error.response.status) {
10083
console.error('Failed to get folder content', this.item.injected.id, error.response)
10184
}
102-
} finally {
103-
this.cancelRequest = null
10485
}
10586
},
10687

src/mixins/FetchAlbumsMixin.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ import { getCurrentUser } from '@nextcloud/auth'
2828

2929
import client from '../services/DavClient.js'
3030
import logger from '../services/logger.js'
31-
import cancelableRequest from '../utils/CancelableRequest.js'
3231
import { genFileInfo } from '../utils/fileUtils.js'
32+
import * as RequestHandler from '../services/RequestHandler'
3333

3434
export default {
3535
name: 'FetchAlbumsMixin',
@@ -38,18 +38,13 @@ export default {
3838
return {
3939
errorFetchingAlbums: null,
4040
loadingAlbums: false,
41-
cancelAlbumsRequest: () => { },
4241
}
4342
},
4443

4544
async beforeMount() {
4645
this.fetchAlbums()
4746
},
4847

49-
beforeDestroy() {
50-
this.cancelAlbumsRequest('Changed view')
51-
},
52-
5348
computed: {
5449
...mapGetters([
5550
'albums',
@@ -66,11 +61,9 @@ export default {
6661
this.loadingAlbums = true
6762
this.errorFetchingAlbums = null
6863

69-
const { request, cancel } = cancelableRequest(client.getDirectoryContents)
70-
this.cancelAlbumsRequest = cancel
71-
72-
const response = await request(`/photos/${getCurrentUser()?.uid}/albums`, {
73-
data: `<?xml version="1.0"?>
64+
const response = await RequestHandler.queue.add(() =>
65+
client.getDirectoryContents(`/photos/${getCurrentUser()?.uid}/albums`, {
66+
data: `<?xml version="1.0"?>
7467
<d:propfind xmlns:d="DAV:"
7568
xmlns:oc="http://owncloud.org/ns"
7669
xmlns:nc="http://nextcloud.org/ns"
@@ -82,9 +75,9 @@ export default {
8275
<nc:dateRange />
8376
</d:prop>
8477
</d:propfind>`,
85-
details: true,
78+
details: true,
79+
}))
8680

87-
})
8881
const albums = response.data
8982
.filter(album => album.filename !== '/photos/admin/albums')
9083
.map(album => genFileInfo(album))
@@ -121,7 +114,6 @@ export default {
121114
logger.error(t('photos', 'Failed to fetch albums list.'), error)
122115
showError(t('photos', 'Failed to fetch albums list.'))
123116
} finally {
124-
this.cancelAlbumsRequest = () => { }
125117
this.loadingAlbums = false
126118
}
127119
},

src/mixins/FetchFacesMixin.js

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ import { getCurrentUser } from '@nextcloud/auth'
2727

2828
import client from '../services/DavClient.js'
2929
import logger from '../services/logger.js'
30-
import cancelableRequest from '../utils/CancelableRequest.js'
3130
import DavRequest from '../services/DavRequest'
3231
import { genFileInfo } from '../utils/fileUtils'
32+
import * as RequestHandler from '../services/RequestHandler'
3333

3434
export default {
3535
name: 'FetchFacesMixin',
@@ -40,20 +40,13 @@ export default {
4040
loadingFaces: false,
4141
errorFetchingFiles: null,
4242
loadingFiles: false,
43-
cancelFacesRequest: () => { },
44-
cancelFilesRequest: () => {},
4543
}
4644
},
4745

4846
async beforeMount() {
4947
this.fetchFaces()
5048
},
5149

52-
beforeDestroy() {
53-
this.cancelFacesRequest('Changed view')
54-
this.cancelFilesRequest('Changed view')
55-
},
56-
5750
computed: {
5851
...mapGetters([
5952
'faces',
@@ -78,10 +71,8 @@ export default {
7871
this.loadingFaces = true
7972
this.errorFetchingFaces = null
8073

81-
const { request, cancel } = cancelableRequest(client.getDirectoryContents)
82-
this.cancelFacesRequest = cancel
83-
84-
const faces = await request(`/recognize/${getCurrentUser()?.uid}/faces/`)
74+
const faces = await RequestHandler.queue.add(() =>
75+
client.getDirectoryContents(`/recognize/${getCurrentUser()?.uid}/faces/`))
8576
this.$store.dispatch('addFaces', { faces })
8677
logger.debug(`[FetchFacesMixin] Fetched ${faces.length} new faces: `, faces)
8778
} catch (error) {
@@ -95,7 +86,6 @@ export default {
9586
logger.error(t('photos', 'Failed to fetch faces list.'), error)
9687
showError(t('photos', 'Failed to fetch faces list.'))
9788
} finally {
98-
this.cancelFacesRequest = () => { }
9989
this.loadingFaces = false
10090
}
10191
},
@@ -113,15 +103,14 @@ export default {
113103
this.errorFetchingFiles = null
114104
this.loadingFiles = true
115105

116-
const { request, cancel } = cancelableRequest(client.getDirectoryContents)
117-
this.cancelFilesRequest = cancel
118-
119-
let { data: fetchedFiles } = await request(
120-
`/recognize/${getCurrentUser()?.uid}/faces/${faceName}`,
121-
{
122-
data: DavRequest,
123-
details: true,
124-
}
106+
let { data: fetchedFiles } = await RequestHandler.queue.add(() =>
107+
client.getDirectoryContents(
108+
`/recognize/${getCurrentUser()?.uid}/faces/${faceName}`,
109+
{
110+
data: DavRequest,
111+
details: true,
112+
}
113+
)
125114
)
126115

127116
fetchedFiles = fetchedFiles
@@ -150,7 +139,6 @@ export default {
150139
logger.error('Error fetching face files', error)
151140
} finally {
152141
this.loadingFiles = false
153-
this.cancelFilesRequest = () => { }
154142
}
155143
},
156144
},

0 commit comments

Comments
 (0)