Vuelidate 异步验证结果到循环

Posted

技术标签:

【中文标题】Vuelidate 异步验证结果到循环【英文标题】:Vuevalidate async validation results to a loop 【发布时间】:2019-01-25 21:53:40 【问题描述】:

我正在使用Vue Validate

我的 vuevlidate 中有以下内容

      validations: 
        user_form: 
            email: required,email, isUnique(value) 
                    // standalone validator ideally should not assume a field is required
                    if (value === '') return true;
                    // simulate async call, fail for all logins with even length
                    return new Promise((resolve, reject) => 
                       this.$http.post("v1/user-management/users/email-registeredi",email:value).then((res)=>
                            console.log("res is ", res);
                            resolve(true);
                        ,(err)=>
                            reject(false)
                        )
                    )
                ,
            role: required,
            password: required
        
    ,

上面创建了一个无限循环的http请求,尤其是当它出错时

我哪里错了

【问题讨论】:

http 请求的无限循环意味着isUnique 函数被无限调用。我无法用这个demo 重现它。您可以编辑演示以重现该问题吗? 【参考方案1】:

你不需要使用“new Promise”,因为 vue-resource 已经这样做了。试试这个:

validations: 
    user_form: 
        email: required,email, isUnique(value) 
                // standalone validator ideally should not assume a field is required
                if (value === '') return true;
                // simulate async call, fail for all logins with even length

               return this.$http.post("v1/user-management/users/email-registeredi",email:value).then((res)=>
                    console.log("res is ", res);
                    return true;
                ,(err)=>
                    return false;
                );
            ,
        role: required,
        password: required
    
,

【讨论】:

【参考方案2】:

如果 vue validate 没有很好地处理拒绝承诺并创建无限循环。 您可以尝试,async await 用于 Vue 验证的 isUnique,try 和 catch 在错误时返回 false, 像这样的。

validations: 
 user_form: 
  email: 
    required,
    email,
    async isUnique (value) 
        if (value === '') return true
        try
          const response = await this.$http.post("v1/user-management/users/email-registeredi",email:value)
          return true;
        
        catch(e)
          return false;
           
      
   
 

【讨论】:

以上是关于Vuelidate 异步验证结果到循环的主要内容,如果未能解决你的问题,请参考以下文章

如何使用promise获取异步方法的结果?

Angular 11异步验证器触发真实响应的无限循环请求

使用 AsyncTask 的结果在其 onPostExecute 内运行 for 循环(再次异步)

Nginx 的异步非阻塞体现在哪里?从理论分析到源码验证

java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring Even

异步响应到javascript NodeJS中的循环