【问题标题】:Returning Result from Function in Asynchronous Ajax Request `then` Call [duplicate]从异步Ajax请求`then`调用中的函数返回结果[重复]
【发布时间】:2020-07-17 17:41:19
【问题描述】:

对这些新方法还是很陌生。

如下声明一个异步 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) )
    }

  . . . . . 

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

function ajaxCallResult(data){

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

}

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

但由于它是链式的,我不知道如何将其声明为一个变量来返回结果。

【问题讨论】:

    标签: jquery ajax asynchronous async-await


    【解决方案1】:

    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);
    });
    

    【讨论】:

    • 更简洁,逐行调试,我可以看到它正在按预期进行。但是有一个问题,它在successCb(ajaxCallResult(data)) 之后在successCb 失败,它停止给出错误successCb is not a function...
    • @bbruman 立即尝试
    • 现在语法更正确,但错误相同....Uncaught (in promise) TypeError: successCb is not a function ...抱歉,我不确定您要做什么..successCb是什么,看起来就像来自validate() 的返回值,你为什么要在最后一步将其作为函数调用?
    • 问题是你不能直接从异步函数返回值,所以你必须同步你的代码才能在你的承诺解决或回调有一些价值之后运行。这里successCb 是一个函数,将在doAjax 解析后执行
    • 是的,在浏览了您的代码并查看了它的作用后,我了解了更多。我没有看到 successCb 在任何地方被声明为函数,除非我发现有问题?
    猜你喜欢
    • 2013-03-28
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多