1
1
import type { ComputedRef , Ref } from 'vue-demi'
2
2
import type { EventHookOn , Fn , MaybeRef , Stoppable } from '@vueuse/shared'
3
- import { containsProp , createEventHook , useTimeoutFn } from '@vueuse/shared'
3
+ import { containsProp , createEventHook , useTimeoutFn , until } from '@vueuse/shared'
4
4
import { computed , isRef , ref , shallowRef , unref , watch } from 'vue-demi'
5
5
import { defaultWindow } from '../_configurable'
6
6
@@ -251,11 +251,11 @@ export function createFetch(config: CreateFetchOptions = {}) {
251
251
return useFactoryFetch as typeof useFetch
252
252
}
253
253
254
- export function useFetch < T > ( url : MaybeRef < string > ) : UseFetchReturn < T >
255
- export function useFetch < T > ( url : MaybeRef < string > , useFetchOptions : UseFetchOptions ) : UseFetchReturn < T >
256
- export function useFetch < T > ( url : MaybeRef < string > , options : RequestInit , useFetchOptions ?: UseFetchOptions ) : UseFetchReturn < T >
254
+ export function useFetch < T > ( url : MaybeRef < string > ) : UseFetchReturn < T > & PromiseLike < UseFetchReturn < T > >
255
+ export function useFetch < T > ( url : MaybeRef < string > , useFetchOptions : UseFetchOptions ) : UseFetchReturn < T > & PromiseLike < UseFetchReturn < T > >
256
+ export function useFetch < T > ( url : MaybeRef < string > , options : RequestInit , useFetchOptions ?: UseFetchOptions ) : UseFetchReturn < T > & PromiseLike < UseFetchReturn < T > >
257
257
258
- export function useFetch < T > ( url : MaybeRef < string > , ...args : any [ ] ) : UseFetchReturn < T > {
258
+ export function useFetch < T > ( url : MaybeRef < string > , ...args : any [ ] ) : UseFetchReturn < T > & PromiseLike < UseFetchReturn < T > > {
259
259
const supportsAbort = typeof AbortController === 'function'
260
260
261
261
let fetchOptions : RequestInit = { }
@@ -353,15 +353,15 @@ export function useFetch<T>(url: MaybeRef<string>, ...args: any[]): UseFetchRetu
353
353
354
354
if ( isCanceled || ! fetch ) {
355
355
loading ( false )
356
- return Promise . resolve ( )
356
+ return Promise . resolve ( null )
357
357
}
358
358
359
359
let responseData : any = null
360
360
361
361
if ( timer )
362
362
timer . start ( )
363
363
364
- return new Promise ( ( resolve , reject ) => {
364
+ return new Promise < Response | null > ( ( resolve , reject ) => {
365
365
fetch (
366
366
context . url ,
367
367
{
@@ -381,13 +381,15 @@ export function useFetch<T>(url: MaybeRef<string>, ...args: any[]): UseFetchRetu
381
381
382
382
if ( options . afterFetch )
383
383
( { data : responseData } = await options . afterFetch ( { data : responseData , response : fetchResponse } ) )
384
+
384
385
data . value = responseData
386
+
385
387
// see: https://www.tjvantoll.com/2015/09/13/fetch-and-errors/
386
388
if ( ! fetchResponse . ok )
387
389
throw new Error ( fetchResponse . statusText )
388
390
389
391
responseEvent . trigger ( fetchResponse )
390
- resolve ( fetchResponse )
392
+ return resolve ( fetchResponse )
391
393
} )
392
394
. catch ( async ( fetchError ) => {
393
395
let errorData = fetchError . message || fetchError . name
@@ -399,9 +401,9 @@ export function useFetch<T>(url: MaybeRef<string>, ...args: any[]): UseFetchRetu
399
401
400
402
errorEvent . trigger ( fetchError )
401
403
if ( throwOnFailed )
402
- reject ( fetchError )
403
- else
404
- resolve ( undefined )
404
+ return reject ( fetchError )
405
+
406
+ return resolve ( null )
405
407
} )
406
408
. finally ( ( ) => {
407
409
loading ( false )
@@ -479,11 +481,25 @@ export function useFetch<T>(url: MaybeRef<string>, ...args: any[]): UseFetchRetu
479
481
}
480
482
}
481
483
484
+ function waitUntilFinished ( ) {
485
+ return new Promise < UseFetchReturn < T > > ( ( resolve , reject ) => {
486
+ until ( isFinished ) . toBe ( true )
487
+ . then ( ( ) => resolve ( shell ) )
488
+ . catch ( error => reject ( error ) )
489
+ } )
490
+ }
491
+
482
492
function setType ( type : DataType ) {
483
493
return ( ) => {
484
494
if ( ! isFetching . value ) {
485
495
config . type = type
486
- return shell as any
496
+ return {
497
+ ...shell ,
498
+ then ( onFulfilled : any , onRejected : any ) {
499
+ return waitUntilFinished ( )
500
+ . then ( onFulfilled , onRejected )
501
+ } ,
502
+ } as any
487
503
}
488
504
return undefined
489
505
}
@@ -492,7 +508,13 @@ export function useFetch<T>(url: MaybeRef<string>, ...args: any[]): UseFetchRetu
492
508
if ( options . immediate )
493
509
setTimeout ( execute , 0 )
494
510
495
- return shell
511
+ return {
512
+ ...shell ,
513
+ then ( onFulfilled , onRejected ) {
514
+ return waitUntilFinished ( )
515
+ . then ( onFulfilled , onRejected )
516
+ } ,
517
+ }
496
518
}
497
519
498
520
function joinPaths ( start : string , end : string ) : string {
0 commit comments