javascript - 如果重构,重构 AJAX 调用将不起作用

标签 javascript c# jquery ajax asp.net-web-api

这是之前的代码:

function getData(query) {
    $.ajax({
        url: "/Api/GetData/" + query,
            success: function (data) {
                var template = $dataTemplate.html();
                var html = Mustache.to_html(template, data);
                $dataField.html(html);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.responseText);
            }
        });
}

我用它来将数据绑定(bind)到选择字段,它工作得很好,但现在我需要在不同的地方使用相同的代码,所以我决定将调用分开在不同的文件中,以便我可以重用它。这是重构的 AJAX 调用:

function getDataApiCall(query) {
    $.ajax({
        url: "/Api/GetData/" + query,
            success: function (data) {
                console.log(data);
                return data;
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.responseText);
                return null;
            }
        });
}

现在第一个函数如下所示:

function getData(query) {
    var data = getDataApiCall(query);
    if (data != null)
    {
        console.log(data);
        var template = $dataTemplate.html();
        var html = Mustache.to_html(template, data);
        $dataField.html(html);
    }
}

第一个控制台日志未定义,第二个控制台日志看起来不错,其中包含所有数据,但也有一个 __proto__ 元素,我不知道为什么会在那里。因为返回的数组不为空,所以选择被绑定(bind),但由于某种原因它是空的。知道我哪里出错了吗?

此外,在输入上面的所有内容时,我记得 API 调用是异步的(我使用 ASP.NET MVC 5 作为 API),也许这与它有关?

最佳答案

I remembered that the API call is async [...] and maybe that has something to do with it?

你是对的。不幸的是,您不能只从异步调用返回一个值,而是必须使用回调,或者您可以查看 promises 。以下是如何重构代码的示例:

function getDataApiCall(query, onSuccess, onError) {
    $.ajax({
        url: "/Api/GetData/" + query,
            success: function (data) {
                console.log(data);
                onSuccess(data);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                onError(xhr.responseText);
            }
        });
}


function getData(query) {
    getDataApiCall(query, function(data) {
        if (data != null) {
            console.log(data);
            var template = $dataTemplate.html();
            var html = Mustache.to_html(template, data);
            $dataField.html(html);
        }
    }, function(err) {
        alert(err);
    }
}

关于javascript - 如果重构,重构 AJAX 调用将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34116337/

相关文章:

javascript - jQuery UI 对话框和 Textarea 焦点问题

javascript - 如何使用 execCommand 对齐文本

javascript - 使用 firefox addon sdk 显示提示

javascript - 如何将添加的文本保存到 Jquery 文本区域中的复选框值?

c# - 3 层 - 模型重用?

c# - 如何在 C# 中追加 xml 文件?

c# - 在 .NET 中获取/打开临时文件

javascript - jquery参数化字符串就像rails中的参数化方法

javascript - jquery float图表在接近点时突出显示点

javascript - 尝试查找标题是否包含单词然后隐藏该父元素