reject = _reject
})
},
- retryWhen: error => error.message.match(/foo/)
+ onError(error, retry, fail) {
+ if (error.message.match(/foo/)) {
+ retry()
+ } else {
+ fail()
+ }
+ }
})
const root = nodeOps.createElement('div')
reject = _reject
})
},
- retryWhen: error => error.message.match(/bar/)
+ onError(error, retry, fail) {
+ if (error.message.match(/bar/)) {
+ retry()
+ } else {
+ fail()
+ }
+ }
})
const root = nodeOps.createElement('div')
expect(serializeInner(root)).toBe('<!---->')
})
- test('retry (fail w/ maxRetries)', async () => {
+ test('retry (fail w/ max retry attempts)', async () => {
let loaderCallCount = 0
let reject: (e: Error) => void
reject = _reject
})
},
- retryWhen: error => error.message.match(/foo/),
- maxRetries: 1
+ onError(error, retry, fail, attempts) {
+ if (error.message.match(/foo/) && attempts <= 1) {
+ retry()
+ } else {
+ fail()
+ }
+ }
})
const root = nodeOps.createElement('div')
ComponentInternalInstance,
isInSSRComponentSetup
} from './component'
-import { isFunction, isObject, NO } from '@vue/shared'
+import { isFunction, isObject } from '@vue/shared'
import { ComponentPublicInstance } from './componentProxy'
import { createVNode } from './vnode'
import { defineComponent } from './apiDefineComponent'
errorComponent?: PublicAPIComponent
delay?: number
timeout?: number
- retryWhen?: (error: Error) => any
- maxRetries?: number
suspensible?: boolean
+ onError?: (
+ error: Error,
+ retry: () => void,
+ fail: () => void,
+ attempts: number
+ ) => any
}
export function defineAsyncComponent<
errorComponent: errorComponent,
delay = 200,
timeout, // undefined = never times out
- retryWhen = NO,
- maxRetries = 3,
- suspensible = true
+ suspensible = true,
+ onError: userOnError
} = source
let pendingRequest: Promise<Component> | null = null
let resolvedComp: Component | undefined
let retries = 0
- const retry = (error?: unknown) => {
+ const retry = () => {
retries++
pendingRequest = null
return load()
(thisRequest = pendingRequest = loader()
.catch(err => {
err = err instanceof Error ? err : new Error(String(err))
- if (retryWhen(err) && retries < maxRetries) {
- return retry(err)
+ if (userOnError) {
+ return new Promise((resolve, reject) => {
+ const userRetry = () => resolve(retry())
+ const userFail = () => reject(err)
+ userOnError(err, userRetry, userFail, retries + 1)
+ })
} else {
throw err
}