【问题标题】:Javascript - local scope objects not accessible from nested functionJavascript - 无法从嵌套函数访问的本地范围对象
【发布时间】:2011-02-03 20:41:40
【问题描述】:

我试图让一个函数从另一个页面上的 php 文件中抓取一个对象。我正在使用 jQuery ajax 函数来进行 json 抓取,它工作正常。问题是当我尝试从函数中返回该对象时。

我第一次记录对象(从成功函数中)在控制台中是正确的,但从函数 getGantt() 返回的对象记录为“未定义”。

如何从函数中取出这个对象?

我的代码:

    function getGantt(requestNumber){
        var ganttObject;
        $.ajax({
               type: "POST",
               url: "get_gantt.php",
               data: {request_number: requestNumber},
               success: function(returnValue){
                     ganttObject = $.parseJSON(returnValue);
                    console.log(ganttObject); //this logs a correct object in the console

                }
        });
        return ganttObject;
    }

    $(function(){ //document ready function

        var requestNumber = $('#request_number').text();

        var ganttObject = getGantt(requestNumber);
        console.log(ganttObject); //this logs "undefined"

    }); //end document ready function

【问题讨论】:

  • 您在 ajax 回调设置 ganttObject 之前返回一个变量。
  • AJAX 是异步运行的,您的 getGantt 函数要等到 AJAX 进程完成后才会获取值,即返回发生后。您需要重组您的编程以 (a) 在成功函数中使用 returnValue (b) 将 returnValue 存储在稍后可访问的全局/对象变量中(导致所需的触发/等待过程出现问题)
  • 感谢大家的所有回答; stackoverflow 非常快。 10 分钟内给出三个好答案!

标签: javascript jquery ajax function local-variables


【解决方案1】:

Ajax 中的 A 是首字母缩略词的重要组成部分。异步 JavaScript 和 XML 是异步的。

$.ajax({success:someFunction}) 表示发出 HTTP 请求,当响应到达时,运行 someFunction

return ganttObject 在响应到达之前运行。

您应该对内部 someFunction 的数据做任何您想做的事情,而不是尝试将数据返回给调用函数。

【讨论】:

  • LOL love Ajax 中的 A 是首字母缩略词的重要组成部分...下次会使用它。
  • 我可能应该补充一点,X 并不重要;)
  • 谢谢,我完全忘记了 ajax 被排除在正常流程之外的事情。这完全回答了我的问题。
  • Dorward - 不仅不重要,而且具有误导性:)
  • A 很重要,但 X 不重要,因为大多数人使用 JSON 而不是 XML
【解决方案2】:

AJAX 中的 A 代表异步。所以调用立即返回,一旦完成,就会调用成功回调。

因此,只需更改您的代码以使用回调:

function getGantt(requestNumber, callback) {
    var ganttObject;
    $.ajax({
        type: "POST",
        dataType: 'json',
        url: "get_gantt.php",
        data: {request_number: requestNumber},
        success: function(returnValue){
            callback(returnValue);
        }
    });
}

$(function() {

    var requestNumber = $('#request_number').text();

    var ganttObject = getGantt(requestNumber, function(ganttObject) {
        console.log(ganttObject);
    });

});

顺便说一句,我还删除了这个 parseJSON 的东西 - 将 dataType 设置为 json 可以完成这项工作并且不那么脏。

【讨论】:

    【解决方案3】:

    我知道为什么它至少不返回它。 ganttObject 可能在同一范围内,但成功函数最终在 XMLHTTP 对象的 readyState 回调中运行,因此它与 getGantt 函数位于不同的线程上。你能把 $(function(){... 代码从你的成功函数中分离出来吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多