JavaScript ajax 函数设置为 Synchronus - 返回空对象

标签 javascript jquery ajax

我做了一些研究,但找不到适合这种情况的例子。这是我的 JavaScript 代码:

function obtainChartData(chart) {
    "use strict";
    $.ajax({
        url: 'server/ExtractTelemetry.php',
        type: "POST",
        async: false,
        data: JSON.stringify(chart),
        success: function (data) {
            var x = jQuery.parseJSON(data);
            alert(typeof x); //SHOWS AS "object"
            return x;
        }
    });
}

然后这个函数接收它:

$("#loadChart").click(function () {
    ...
    data = obtainChartData(newChart);
    alert(typeof data); //SHOWS AS "undefined"
    ...
});

如果ajax调用设置为异步,那么我会理解为什么会发生这种情况,但在这种情况下,“数据”直到函数返回才被分配。那么为什么它显示为未定义呢?

最佳答案

不存在同步 AJAX 调用(AJAX 代表“异步 JavaScript 和 XML”)。

jQuery 会忽略 success 函数的返回值。

您刚刚发现了每个使用 javascript 的人都会遇到的非常基本的问题——应用程序中的某个地方会有异步代码(例如 AJAX 代码),并且您必须使所有使用此函数的代码也异步。

自从这个问题出现以来,人们有很多想法,例如Promises 和新的 ES6 await/async 关键字。为了简单起见,现在您可以将回调传递给 obtainChartData 并让它处理结果:

function obtainChartData(chart, callback) {
    "use strict";
    $.ajax({
        url: 'server/ExtractTelemetry.php',
        type: "POST",
        async: false,
        data: JSON.stringify(chart),
        success: function (data) {
            var x = jQuery.parseJSON(data);
            alert(typeof x); //SHOWS AS "object"
            callback(x); // instead of return!
        }
    });
}

$("#loadChart").click(function () {
    ...
    obtainChartData(newChart, function (data) {
        alert(typeof data);
    });
    ...
});

关于JavaScript ajax 函数设置为 Synchronus - 返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32780342/

相关文章:

javascript - 在异步操作完成之前解决 promise

javascript - 如何将 Chrome 扩展功能移植到移动设备(特别是 jquery 和 trello)?

jquery - 为什么我的jquery延迟处理错误和jsonp数据不起作用?

php - Ajax 不发送数据 [Codeigniter]

javascript - 使用 jQuery 在页面加载时淡入图片

javascript - 如何分离 session 控制而不是将其写在每个路由中

javascript - 我该如何做这个正则表达式?

c# - 我应该如何实现 Ajax 请求的长轮询的 C# 服务器端部分?

javascript - JSON 请求的无效标签错误

javascript - 使用 dependentObservable 加载数据导致无限循环