javascript - 异步 js 验证表单

标签 javascript jquery ecmascript-6 async-await

早上好! 目前我正在尝试使用 javascript 创建某种简单的验证,但我在使用异步功能时遇到了问题。

您可以在下方看到遍历 validityChecks 集合的 UI 方法

    checkValidity: function(input){
        for(let i = 0; i<this.validityChecks.length; i++){

            var isInvalid = this.validityChecks[i].isInvalid(input);//promise is returned
            if(isInvalid){
                this.addInvalidity(this.validityChecks[i].invalidityMessage);
            }

            var requirementElement = this.validityChecks[i].element;
            if(requirementElement){
                if(isInvalid){
                    requirementElement.classList.add('invalid');
                    requirementElement.classList.remove('valid');
                }else{
                    requirementElement.classList.remove('invalid');
                    requirementElement.classList.add('valid');
                }
            }
        }
    }

下面是特定的集合对象,它没有按预期工作

var usernameValidityChecks = [
    {
        isInvalid: function(input){
            var unwantedSigns = input.value.match(/[^a-zA-Z0-9]/g);
            return unwantedSigns ? true:false;
        },
        invalidityMessage:'Only letters and numbers are allowed',
        element: document.querySelector('.username-registration li:nth-child(2)')
    },
    {
        isInvalid: async function (input){
            return await checkUsername(input.value);
        },
        invalidityMessage: 'This value needs to be unique',
        element: document.querySelector('.username-registration li:nth-child(3)')
    }

]
function checkUsername (username) {
    return new Promise ((resolve, reject) =>{
        $.ajax({
            url: "check.php",
            type: "POST",
            data: { user_name: username },
            success: (data, statusText, jqXHR) => {
                resolve(data);
            },
            error: (jqXHR, textStatus, errorThrown) => {
                reject(errorThrown);
            }
        });
    });
}

问题是 checkValidity 方法中的 var isInvalid 返回了 promise。谁能建议如何返回那里的值(value)而不是 promise ?或者如何处理那里的 promise ? 先感谢您!
编辑:
请原谅,但这是我第一次使用 Stack,可能我的问题有点不准确。集合中的一些对象也是同步,我更改了usernameValidityChecks。如何处理这种情况?
我在哪里同时有异步和同步方法?

最佳答案

而不是下行

var isInvalid = this.validityChecks[i].isInvalid(input);

您可以使用下面的代码使代码更简洁并将所需的值存储在变量上,但是上面建议的解决方案也是正确的

var isInvalid = await this.validityChecks[i].isInvalid(input).catch((err) => { console.log(err) });

在此行之后,您将在 isInvalid 变量上获得所需的值

并且还在所有其他 isInvalid 函数定义中添加 async 关键字

关于javascript - 异步 js 验证表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56034930/

相关文章:

javascript - 当前行的 ng-hide 和 ng-show

ruby-on-rails - 与没有 Ajax 或 jQuery on Rails 的情况类似/不同

javascript - 从第三方库导入 javascript 模块

javascript - onClick 不渲染不同的 react 组件

javascript - 请求特定的 RequireJS 配置上下文

javascript - 如何在 jQuery 文本中添加淡入效果

reactjs - 我如何使用像 loglevel 这样的库在我的 React/Redux Web 应用程序中进行日志记录

javascript - 是什么导致错误 "Uncaught TypeError: number is not a function"

javascript - ng-template 中的 Angular 6 嵌套 ViewChild 为空

javascript - 如何忽略 JavaScript 中 require 的多个返回值之一?