Skip to content

Commit d763544

Browse files
committed
do not start resolving async components until previous hooks have been resolved (fix #1329)
1 parent 99fefba commit d763544

File tree

1 file changed

+53
-58
lines changed

1 file changed

+53
-58
lines changed

src/history/base.js

Lines changed: 53 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -307,70 +307,65 @@ function poll (
307307
}
308308

309309
function resolveAsyncComponents (matched: Array<RouteRecord>): Function {
310-
let _next
311-
let pending = 0
312-
let error = null
313-
314-
flatMapComponents(matched, (def, _, match, key) => {
315-
// if it's a function and doesn't have cid attached,
316-
// assume it's an async component resolve function.
317-
// we are not using Vue's default async resolving mechanism because
318-
// we want to halt the navigation until the incoming component has been
319-
// resolved.
320-
if (typeof def === 'function' && def.cid === undefined) {
321-
pending++
322-
323-
const resolve = once(resolvedDef => {
324-
// save resolved on async factory in case it's used elsewhere
325-
def.resolved = typeof resolvedDef === 'function'
326-
? resolvedDef
327-
: _Vue.extend(resolvedDef)
328-
match.components[key] = resolvedDef
329-
pending--
330-
if (pending <= 0 && _next) {
331-
_next()
332-
}
333-
})
310+
return (to, from, next) => {
311+
let hasAsync = false
312+
let pending = 0
313+
let error = null
314+
315+
flatMapComponents(matched, (def, _, match, key) => {
316+
// if it's a function and doesn't have cid attached,
317+
// assume it's an async component resolve function.
318+
// we are not using Vue's default async resolving mechanism because
319+
// we want to halt the navigation until the incoming component has been
320+
// resolved.
321+
if (typeof def === 'function' && def.cid === undefined) {
322+
hasAsync = true
323+
pending++
324+
325+
const resolve = once(resolvedDef => {
326+
// save resolved on async factory in case it's used elsewhere
327+
def.resolved = typeof resolvedDef === 'function'
328+
? resolvedDef
329+
: _Vue.extend(resolvedDef)
330+
match.components[key] = resolvedDef
331+
pending--
332+
if (pending <= 0) {
333+
next()
334+
}
335+
})
334336

335-
const reject = once(reason => {
336-
const msg = `Failed to resolve async component ${key}: ${reason}`
337-
process.env.NODE_ENV !== 'production' && warn(false, msg)
338-
if (!error) {
339-
error = reason instanceof Error
340-
? reason
341-
: new Error(msg)
342-
if (_next) _next(error)
343-
}
344-
})
337+
const reject = once(reason => {
338+
const msg = `Failed to resolve async component ${key}: ${reason}`
339+
process.env.NODE_ENV !== 'production' && warn(false, msg)
340+
if (!error) {
341+
error = reason instanceof Error
342+
? reason
343+
: new Error(msg)
344+
next(error)
345+
}
346+
})
345347

346-
let res
347-
try {
348-
res = def(resolve, reject)
349-
} catch (e) {
350-
reject(e)
351-
}
352-
if (res) {
353-
if (typeof res.then === 'function') {
354-
res.then(resolve, reject)
355-
} else {
356-
// new syntax in Vue 2.3
357-
const comp = res.component
358-
if (comp && typeof comp.then === 'function') {
359-
comp.then(resolve, reject)
348+
let res
349+
try {
350+
res = def(resolve, reject)
351+
} catch (e) {
352+
reject(e)
353+
}
354+
if (res) {
355+
if (typeof res.then === 'function') {
356+
res.then(resolve, reject)
357+
} else {
358+
// new syntax in Vue 2.3
359+
const comp = res.component
360+
if (comp && typeof comp.then === 'function') {
361+
comp.then(resolve, reject)
362+
}
360363
}
361364
}
362365
}
363-
}
364-
})
366+
})
365367

366-
return (to, from, next) => {
367-
if (error) {
368-
next(error)
369-
} else if (pending <= 0) {
370-
next()
371-
} else {
372-
_next = next
373-
}
368+
if (!hasAsync) next()
374369
}
375370
}
376371

0 commit comments

Comments
 (0)