【问题标题】:Dealing with a strange issue with alert() in Javascript [duplicate]处理 Javascript 中的 alert() 的一个奇怪问题 [重复]
【发布时间】:2013-03-06 15:32:13
【问题描述】:

我在 JavaScript 中有以下方法:

function getData(){
    var result;

    $.getJSON("app/data/ptl", function (data) {
        if (data == null) {
            return false;
        }

        var x_data = new Array();
        var y_data = new Array();

        $.each(data, function(index, value) {
            x_data.push(index);
            y_data.push(value);
        });

        result = [months_data,value_data];

    });

    alert('');
    return result;
}

调用此方法时,将检索准确的数据。但是,当我删除 alert('') 时,没有收到数据。有谁知道此类问题的合理解释?

【问题讨论】:

  • 我认为您需要向我们展示其他内容。这是您正在做的事情的一个简单版本,无论是否有警报都对我不起作用:jsfiddle.net/3yhqf/4 关于异步结果的答案是正确的,应该可以解决您的问题,但是添加警报不会让 return 语句赶上更新。

标签: javascript


【解决方案1】:

那是因为您的函数是异步的,删除 alert 会使 return r 行在远程服务器应答之前执行。

您不能简单地从调用异步工作的函数同步返回。通常的解决方案是提供一个回调并在回调中执行你想要做的事情:

function fetchData(doWithData){
  $.getJSON("app/data/ptl", function (data) {
    if (data == null) {
        return;
    }
    var x_data = new Array();
    var y_data = new Array();
    $.each(data, function(index, value) {
        x_data.push(index);
        y_data.push(value);
    });
    r = [months_data,value_data];
    doWithData(r);
   });
}


fetchData(function(result) {
   // use result here
});

【讨论】:

  • 无论警报如何,原始功能不应该运行完成吗?我不确定为什么警报会延迟返回。这里似乎没有:jsfiddle.net/3yhqf
  • 一个警报被同步处理,它停止代码。
  • 嗯,但是为什么回调在 getData 函数完成之前运行呢? getData 不应该在回调运行之前运行完成吗?
  • @ben336 +1 你的评论很中肯。我现在不能给你一个好的答案。事实上,即使有警报,我也无法让 OP 的代码在我的浏览器中运行(我没有 IE)。
【解决方案2】:

您的 alert()return r; 在您的 ajax 调用的“成功”处理程序之外。请记住 AJAX 调用是异步的。警报迫使浏览器等待您确认警报,这通常允许 AJAX 调用完成并填充您的 r 变量。如果没有警报,.getJSON() 会立即返回,在 r 填充之前。

【讨论】:

  • 无论警报如何,原始功能都不应该运行完成吗?我不确定为什么警报会延迟返回。这里似乎没有:jsfiddle.net/3yhqf
  • 没有。缩进关闭。在 alert() 行之前是 });,它关闭了成功处理程序。如果}); 是在返回调用之后,那么代码会更正确。
  • 据我所知,他发出异步请求,调用警报,然后返回。原始函数不应该运行完成,然后让回调运行吗?这就是它在小提琴中更简单的示例中的工作原理。
  • @ben336:我修复了 OP 原件中的缩进。请注意,警报/返回是 NOT .getjson() 调用的一部分。
  • 我知道这一点。这才是重点。在警报和返回完成之后,JSON 调用的回调不应运行。 JS 函数不会同时运行(没有网络工作者),一个函数运行完成,然后下一个运行。他描述的行为没有意义
【解决方案3】:

$.getJSON() 调用设置了一个异步进程。该函数本身(几乎)立即返回,但您传入的回调函数将在稍后执行,当浏览器实际收到您正在联系的服务器的响应时。因此,从这样的回调中返回值本质上是没有意义的,因为没有人可以或不会关注它。

相反,您应该做任何需要访问回调函数内部检索到的信息的工作。

【讨论】:

  • 无论警报如何,原始功能都不应该运行完成吗?我不确定为什么警报会延迟返回。这里似乎没有:jsfiddle.net/3yhqf
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2017-07-19
  • 2011-03-23
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多