2013-06-28 223 views
4

我確信我正在做這種各種各樣的錯誤,但我有以下函數返回'undefined'在控制檯,即使它可以console.log()所需的值來自同一地方在函數在代碼中評論。javascript函數返回undefined

var tags = [4, 5]; 
console.log(getTagNames(tags)); // 'undefined' 

function getTagNames(tagArray) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     return tagArray; 
    }); 
} 

另一個奇怪的是,在瀏覽器中運行此代碼後,我可以鍵入「標籤」到瀏覽器控制檯,它給了我正確的結果["foo", "bar"]。然而,當我嘗試使用標籤變量(即:文本值的元素等),它不起作用... 什麼給? JavaScript不是我的第一語言,所以我對它的行爲有些困惑。我只是不明白。

我已經閱讀了幾乎所有的「可能已經有我的答案的問題」,但是提供了那些我無法弄清楚如何應用於我的功能的答案。

注:

  1. 的JSON距離的Joomla(3.1)標籤表。
  2. 我能夠檢索數據。
  3. val === tagId條件工作正常。
  4. 我喜歡爆米花。 success處理器的getJSON其中,第一,不期待任何回報價值,二是異步發生的
+1

'getTagNames' **沒有** return語句。在你的問題中,帶有'return'語句的唯一函數是你傳遞給'getJSON'的匿名函數。 – Quentin

回答

9

致電getJSON異步調用您的回調函數。

如果您需要的功能getTagNames,並調用它在你的代碼中的許多地方,你可以進行更改,使之採取一個回調函數本身:

function getTagNames(tagArray, cb) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     cb(tagArray); 
    }); 
} 

,然後撥打電話,以這樣的:

getTagNames(tags, function(tagArray) { 
    // do something with tagArray 
}); 
+0

我認爲它的「回調」功能,當我需要調用getTagNames函數時,我沒有得到它。就像參數tagarray在這裏表示的那樣。我想用它做什麼?我想我也只是在返回值時使用php。 – jremydeaton

+1

tagArray被複制(像大多數代碼)從您的原始。因此,通過調用getTagNames來填充tagArray。您傳遞的第二個參數是一個處理getTagNames調用「完成」時的「返回值」的函數。 – mbanzon

2

聲明return tagArray;返回結果 - 的方式之後,你getTagNames執行完畢。

+1

這幾乎是我從其他問題中得到的答案,我只查看了一下它的工作原理。不過,我似乎無法找到任何參考資料,因爲我目前對整個概念的理解都是愚蠢的。仍然閱讀一些材料,所以我可以打到「啊哈」時刻。任何地方任何人都可以指導我(最好是基於教程)非常感謝。 – jremydeaton