js中表单验证中的任务执行顺序初探

在写线上运维平台中的表单处理逻辑时,遇到困扰的地方

//验证表单
        checkForm(){
            return new Promise((resolve, reject) => {
                var checkResult=true
                this.$refs['businessInfo'].validate((valid) => {
                    if (valid) {
                    } else {
                        this.$Message.error('请检查业务及归属信息');
                        checkResult=false
                    }
                    console.log('1: '+checkResult)
                })
                this.$refs['topicInfo'].validate((valid) => {
                    if (valid) {
                    } else {
                        this.$Message.error('请检查topic信息');
                        checkResult=false
                    }
                    console.log('2: '+checkResult)
                })
                // 校验topic名称
                let that=this
                that.topicTotal.forEach(function(item,i){
                    // forEach中对this进行了重定向,所以需要将this赋值给其他变量才能引用
                    if(that.topicInfo.topicName===item.topicName){
                        that.$Message.error('该topic已存在,请重新命名')
                        checkResult=false
                    }
                    console.log('3: '+checkResult)
                })
                console.log('4: '+checkResult)
                if(checkResult){
                    resolve(true)
                }else{
                    resolve(false)
                }
            })
        },
        //切换页面
        changeCurrentPage(page) {
            this.defaultPage = page;
            switch (page) {
                case 1: this.$refs.flowApply.changePage(page)
                        this.changLength()
                        break
                case 2: {
                    this.checkForm().then(res=>{
                        console.log('5:'+res)
                        // res=true
                        if (res){
                            this.$refs.flowApply.changePage(page)
                            this.businessInfo.applicant = this.uuapUserName
                            this.newTopicApplyInfo.businessInfo=this.businessInfo
                            this.newTopicApplyInfo.topicInfo=this.topicInfo
                        }
                    })
                    break
                }
                default: {
                    this.$refs.flowApply.changePage(page)
                }
            }
            return false
        },

上面的逻辑并没有按照我预想的顺序由上至下执行,而是

 是因为js维护两个队列,分别放置宏任务和微任务,宏任务优先级高于微任务

代码中的逻辑事件任务类别

逻辑编号 具体逻辑 任务类别 备注
1
this.$refs['topicInfo'].validate((valid) =>
微任务1  
2
this.$refs['topicInfo'].validate((valid) => {
微任务2  
3 script中的正常代码:遍历逻辑 宏任务1  
4 script代码:console 宏任务2  
5
this.checkForm().then(res=>{
另一函数中的微任务1 promise.then

预期的执行顺序是1,2,3,4,5

更正为

  • 将宏任务1和宏任务2放到微任务2中
//验证表单
        checkForm(){
            return new Promise((resolve, reject) => {
                var checkResult=true
                this.$refs['businessInfo'].validate((valid) => {
                    if (valid) {
                    } else {
                        this.$Message.error('请检查业务及归属信息');
                        checkResult=false
                    }
                    console.log('1: '+checkResult)
                })
                this.$refs['topicInfo'].validate((valid) => {
                    if (valid) {
                    } else {
                        this.$Message.error('请检查topic信息');
                        checkResult=false
                    }
                    console.log('2: '+checkResult)
                    // 校验topic名称
                    let that=this
                    that.topicTotal.forEach(function(item,i){
                        // forEach中对this进行了重定向,所以需要将this赋值给其他变量才能引用
                        if(that.topicInfo.topicName===item.topicName){
                            that.$Message.error('该topic已存在,请重新命名')
                            checkResult=false
                        }
                    })
                    console.log('3: '+checkResult)
                    console.log('4: '+checkResult)
                    if(checkResult){
                        resolve(true)
                    }else{
                        resolve(false)
                    }
                })
            })
        },
        //切换页面
        changeCurrentPage(page) {
            this.defaultPage = page;
            switch (page) {
                case 1: this.$refs.flowApply.changePage(page)
                        this.changLength()
                        break
                case 2: {
                    this.checkForm().then(res=>{
                        console.log('5:'+res)
                        // res=true
                        if (res){
                            this.$refs.flowApply.changePage(page)
                            this.businessInfo.applicant = this.uuapUserName
                            this.newTopicApplyInfo.businessInfo=this.businessInfo
                            this.newTopicApplyInfo.topicInfo=this.topicInfo
                        }
                    })
                    break
                }
                default: {
                    this.$refs.flowApply.changePage(page)
                }
            }
            return false
        },

达到了预期

原文地址:https://www.cnblogs.com/Bccd/p/13393460.html