首页 > 解决方案 > 从异步 Ajax 请求`then`调用中的函数返回结果

问题描述

这些新方法仍然很新。

如下声明一个异步 ajax 请求:

async function doAjax(email) {
    let result;

    try {
        result = await jQuery.ajax({
            url: ajaxurl,
            type: 'POST',
            data: {"action": "custome_ajax_email_check", "guestemail": email }
        });

        return result;
    } catch (error) {
        console.error(error);
    }
}

这是在另一个名为的函数中调用的validate()

function validate() {
    var email = jQuery("#billingemail").val();

    if (isValidEmailAddress(email)) {
        doAjax(email).then( (data) => ajaxCallResult(data) )
    }

  . . . . . 

调试到现在,它确实如您所愿... into validate(), on doAjax(),这是最后一个名为(缩小)的函数:

function ajaxCallResult(data){

    data = jQuery.parseJSON(data);
    if(!data.result) {
        return true;
    }
    else {
        return false;
    }

}

但是现在我需要从ajaxCallResult()... 返回(在这种情况下为布尔值),因为 true 或 false 表示用户电子邮件是否存在。

但是由于它是链接的,我不确定如何将它声明为一个变量来返回结果。

标签: jqueryajaxasynchronousasync-await

解决方案


在函数之后重构代码ajaxCall,使其按顺序运行,您可以通过传递回调来验证函数并在承诺解决时编写代码来实现。

async function doAjax(email) {
    let result;
    try {
        result = await jQuery.ajax({
            url: ajaxurl,
            type: 'POST',
            data: {"action": "custome_ajax_email_check", "guestemail": email }
        });

        return result;
    } catch (error) {
        console.error(error);
    }
}

function ajaxCallResult(data){
    data = jQuery.parseJSON(data);
    if(!data.result) {
        return true;
    }
    else {
        return false;
    }
}

function validate(successCb) {
    var email = jQuery("#billingemail").val();

    if (isValidEmailAddress(email)) {
        return doAjax(email)
        .then((data) => {
            return successCb(ajaxCallResult(data));
        });
    }
}

// Calling validate function
validate(function(data) {
    // Response from ajaxCallResult function
    console.log(data);
});

推荐阅读