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
            },

    达到了预期

  • 相关阅读:
    QT 中如何实现一个简单的动画
    qt 中画线时如何设置笔的颜色和填充
    QT自定义窗口
    qt 中创建一个工作线程(例子)
    QT 获取系统时间
    火狐浏览器 system error code 1722 rpc服务器不可用和谷歌浏览器的插件application/x-print-ladop不支持
    ORA-10858:在要求输入数字处找到非数字字符
    eaeyui-combobox实现组合查询(即实现多个值得搜索)
    Mybatis中的模糊查询
    如何设置像我这样的博客的样式。
  • 原文地址:https://www.cnblogs.com/Bccd/p/13393460.html
Copyright © 2011-2022 走看看