2010-12-24 119 views
1

我试图运行这个命令:问题与未定义的变量

function loadApp() { 
    var content = getContent("content.xml"); 
    createMap(content); 
} 

function getContent(file) { 
    $.ajax({ 
     type: "GET", 
     url: file, 
     dataType: "xml", 
     success: parseXml 
    }); 

    function parseXml(xml) { 
     var content = []; 
     $("element", xml).each(function() { 
      var var1 = $(this).children("var1").text(), 
      content.push(var1) 
     }); 

     return content; 
    } 
} 

    function createMap(content) { 
     alert(content); 
    } 

但是,当我打开网页提醒说我的content变量是不确定的。 getContent()正常工作,当我从loadApp()删除createMap(content);时给出content一个字符串值。看起来createMap()getContent()之前运行,这就是为什么该变量还没有定义,为什么会发生这种情况的任何想法,我该如何解决它?

在此先感谢。

+0

也许你应该向我们展示getContent()方法。也许它有一个回调。 – Raghuram 2010-12-24 05:23:53

+0

我想你的'getContent'函数执行异步操作(如Ajax请求)... – CMS 2010-12-24 05:23:55

+0

是的,它是一个Ajax请求 – VerizonW 2010-12-24 05:31:36

回答

2

我假设getContent()进行异步AJAX调用。如果是这样,那么在收到响应之前,createMap()函数被称为

如果是这样,我会修改getContent()函数,以便您可以将createMap()函数传递给它,并在正确的时间调用它。

function loadApp() { 
    getContent("content.xml", createMap); 
} 

function getContent(file, fn) { 
    $.ajax({ 
     type: "GET", 
     url: file, 
     dataType: "xml", 
     success: parseXml 
    }); 

    function parseXml(xml) { 
     var content = []; 
     $("element", xml).each(function() { 
      var var1 = $(this).children("var1").text(), 
      content.push(var1) 
     }); 
      // Call "fn" instead of returning "content" 
     fn(content); 
    } 
} 
+0

谢谢你的工作!但有没有另一种方式让我的函数只在第一个函数完成并返回值时运行? – VerizonW 2010-12-24 05:46:54

+0

@VerizonW:唯一的方法是将ajax请求设置为'async:false',这通常是一个坏主意。最终,你的'getContent'函数会在AJAX请求返回之前退出。正因为如此,任何依赖AJAX响应的代码必须等待运行,直到收到响应。如果'createMap'处于'getContent'可访问的范围内,那么您可以不通过该函数,而直接在'parseXML'中调用它。但在'loadApp()'中调用它将不起作用。 – user113716 2010-12-24 06:13:58