前言【vue-router源码】系列文章将带你从0开始了解vue-router的具体实现。本系列文章源码参考vue-routerv4.0.15。源码地址:https://github.com/vuejs/router阅读本文的前提是你最好了解vue-router的基本使用。如果没有使用过,可以通过vue-router官网进行学习。本文将分析isReady的实现。使用router.isReady().then(()=>{//success}).catch(()=>{//failure})isReadyisReady不接受任何参数。如果路由器已经完成初始化导航,Promise会立即被resolve。反之,如果初始化导航还没有完成,resolve和reject会被放入一个数组,加入到一个list中,等待初始化导航完成触发。letreadyHandlers=useCallbacks()functionisReady():Promise{//ready为真且当前路由不是初始路由,导航已经初始化,立即resolvepromiseif(ready&¤tRoute.value!==START_LOCATION_NORMALIZED)returnPromise.resolve()//相反,resolve和reject会存储在一个列表中returnnewPromise((resolve,reject)=>{readyHandlers.add([resolve,reject])})}之前解决的push过程中,不管过程中有没有错误信息,都会执行一个markAsReady函数。markAsReady中会触发isReady处理函数,触发完成后清空列表。函数markAsReady(err?:E):E|void{if(!ready){//如果有err,说明还没有准备好,如果没有err,说明初始化导航已经完成,ready变为true,则不会再次进入这个分支。ready=!err//设置popstate监听函数setupListeners()//触发ready处理函数,有错误则执行reject(err),不执行resolve()readyHandlers.list().forEach(([resolve,reject])=>(err?reject(err):resolve()))//执行完后清空链表readyHandlers.reset()}returnerr}