【问题标题】:jQuery is returning undefined string from function in .each()jQuery 从 .each() 中的函数返回未定义的字符串
【发布时间】:2012-03-03 00:50:01
【问题描述】:

我正在尝试从名为“tjekdet”的函数返回一个字符串,但它不会返回任何内容,但未定义。我只需要它返回字符串,所以我可以将结果附加到 $(this)。

我之所以这样做,是因为对 test2.php 的请求大约需要 40 秒,所以我宁愿一个一个地做。不过没关系。

这是否与同步调用有关?还是我只是完全错过了一些非常基本的东西?

    function tjekdet(name) {
    $.get("test2.php", { test: name },
        function(data){
        // alert(data); returns correctly in the alert
        return data;
       });
    }

    jQuery(function($) {
        $('.button').live("click",function() {
            $(".navn-list").each(function() {
                var navn = $(this).text();
                var tester = tjekdet(navn);
                alert(tester); // returns undefined
            });
        });

【问题讨论】:

  • tjekdet 的结果不会是调用 $.get 的结果,因为正如您在问题中暗示的那样,$.get 是异步执行的。
  • 这个问题每天都会出现,但是当我需要它作为重复关闭时我永远找不到。

标签: jquery ajax function return each


【解决方案1】:

这和同步调用有关系吗?

是的。嗯,实际上它与 异步 调用有关。您的 tjekdet 函数将在您的 AJAX get 返回任何内容之前返回 undefined

将警报放在成功回调中:

$.get("test2.php", { test: name }, function(data) {
    alert(data);
    //Do whatever you need to do here, not in the other function
});

您可以使用jQuery.ajax 代替jQuery.get 并将async 选项设置为false,但这并不是一个好主意,而且往往会在数据返回之前完全锁定浏览器。

【讨论】:

  • 太好了,谢谢。但!警报返回“是”、“否”、“是”等,因为它应该为每个。但是现在我想将该字符串添加到特定的div中,但由于某种原因我不能使用$(this).append(data);
  • 我建议将div 传递给tjekdet 函数。然后,您可以使用该参数来引用它。例如,function tjekdet(elem) { ... }。然后,您可以在函数中获取元素的名称,而不是将其传入,并且您可以引用 div 以便稍后更新它。
  • 没问题,很高兴能帮上忙 :) 如果您还有其他问题,请在 StackOverflow 上提出新问题!
【解决方案2】:

getajax 的简写,带有一组特定选项。 AJAX 是异步的。这意味着当您的函数完成时请求尚未返回。

get 返回类似内容的唯一选择是使其成为同步调用,这在几乎所有情况下都是一个坏主意,因为浏览器会在等待回应。

您应该对回调中的请求结果做任何您需要做的事情。

【讨论】:

    【解决方案3】:

    因为tjekdet() 实际上并没有返回任何东西。 tjekdet中的return语句确实属于匿名回调,与tjekdet的return无关。

    另外,tjekdet 内部的回调是异步调用的,所以当你调用 alert(tester); 时它可能还没有执行。

    【讨论】:

      【解决方案4】:

      你的代码应该是这样的:

      function tjekdet(name, callback) {
          $.get("test2.php", { test: name },
              function(data){
                  callback(data);
          });
      }
      
      jQuery(function($) {
          $('.button').live("click",function() {
              $(".navn-list").each(function() {
                  var navn = $(this).text();
                  tjekdet(navn, function(data){
                      alert(data);
                  });
              });
          });
      });
      

      tjekdet 内部,您的 ajax 调用是异步的,您可以在该调用完成后执行一些操作...但是由于 tjekdet 将立即返回,您不能期望从 tjekdet 获得正确的值,但您应该调用一些回调方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        相关资源
        最近更新 更多