2010-12-24 121 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