2013-02-06 83 views
0

我有一個JavaScript函數,它應該返回由維基百科頁面鏈接的所有文章的數組,給定標題。設置變量爲函數的結果非常奇怪

這就是:

function getLinksFrom(title, returnArray, plcontinue) { 
    var url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&callback=?'; 
    if (!returnArray) { 
     returnArray = []; 
    } 
    if (!plcontinue) { 
    plcontinue = ''; 
    } 
    if (returnArray.length === 0 || plcontinue !== '') { 
     if (plcontinue !== '') { 
      url = 'http://en.wikipedia.org/w/api.php?action=query&prop=links&titles=' + title + '&format=json&pllimit=500&plnamespace=0&plcontinue=' + plcontinue + '&callback=?'; 
     } 
     $.ajax({url: url, 
      dataType: 'json', 
      async: false, 
      success: function(data) { 
       for (key in data['query']['pages']) { 
        links = data['query']['pages'][key]['links']; 
       } 
       for (var i = 0; i < links.length; i += 1) { 
        returnArray.push(links[i]['title']); 
       } 
       if (data.hasOwnProperty('query-continue')) { 
        plcontinue = data['query-continue']['links']['plcontinue']; 
       } else { 
        plcontinue = ''; 
       } 
       console.log(returnArray); 
       return getLinksFrom(title, returnArray, plcontinue); 
      } 
     }); 
    } 
    console.log(returnArray); 
    return returnArray; 
} 

當我運行這個功能,看控制檯中,執行console.log(returnArray);線把我想要在控制檯。字符串的數組。但這裏是我感到困惑的地方。

我想將那個returnArray存儲在一個名爲links的變量中。這是該行下面的功能。

var links = getLinksFrom('United States'); 

但鏈接並不等於之前記錄的美妙事物。相反,它包含一個對象數組,這不是正確的長度。

這裏發生了什麼?

回答

2

由於getLinksFrom是異步函數,當JS評估函數調用時,它立即將結果寫入links變量。但在那個時候returnArray是空的!

在圖片請看:

enter image description here

這表明推到returnArray它分配給links變量,而最有可能的,使用此變量後後會發生。

所以,如果你使用異步代碼,你不能只做a = b()。通常在這種情況下,人們使用回調:b(function(a) { /* do something with a */ })(參數是一種「成功」功能)。所以你應該重寫你的代碼以使用回調來異步工作。

但是你的代碼還有一個問題:你永遠不會停止自己的呼叫。在每一次成功的請求之後,你發送另一個請求並永不停止。也許,在幾次請求之後,你再也無法獲得任何有用的數據,那麼爲什麼打擾遠程服務器和用戶的網絡無用的請求?當你完成時,不要做遞歸。而不是你可以撥打電話callback通知你的功能調用者你已經完成。

+0

+1爲圖片:-) –