zoukankan      html  css  js  c++  java
  • 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
            },

    达到了预期

  • 相关阅读:
    苹果手机页面高度不够会导致下面fixed的按钮看不到了
    IOS系统倒计时直接到结束的问题解决
    TP6集成gatewayworker报错解决
    easywechat实现公众号支付jsapi支付
    Linux 下没有conio.h 的解决方法
    程序跳转语句
    循环控制语句
    arduino入门实践之驱动LCD12864
    Manjaro 安装MariaDB
    Arduino入门实践之人体红外感应模块
  • 原文地址:https://www.cnblogs.com/Bccd/p/13393460.html
Copyright © 2011-2022 走看看