簡體   English   中英

等待遞歸函數完成

[英]Waiting for Recursive Function To Complete

我有一個遞歸Javascript函數,該函數從一個Wikipedia頁面獲取鏈接,跟隨它們,然后獲取所有這些鏈接(重復指定的次數)。

它稱自己為未知次數,以構造一個已知深度的對象。 完成后,我要輸出對象。 當前,該對象立即輸出,並且為空,這意味着該函數顯然不等待所有遞歸調用完成。

如您所見,我嘗試使用回調,但是我做錯了。 我在做什么錯,應該怎么做? 我將假定還有其他一些我沒有發現的錯誤。 我對Java比較陌生。

$(document).ready(function ()
{
  pageLinks[START_PAGE] = {};
  //Get initial pages
  links = getLinks(START_PAGE, 0, printLinks));
});

function printLinks()
{
  console.log(links);
}

function getLinks(currentPage, level, callback)
{
  visitedPages.push(currentPage)
  var pageLinks = {}
  var data = $.getJSON(URL_BEGIN + currentPage + URL_END, function(data)
  {
    var pages = data.query.pages;
    for(var page in pages)
    {
      pageContentObj = pages[page].revisions[0];
      for(var key in pageContentObj) if(pageContentObj[key].length > 100)
      {
        var pageContent = pageContentObj[key];
        //Get links
        hyperlinks = getFromBetween.get(pageContent,"[[","]]");
        for(var link in hyperlinks)
        {
          link = hyperlinks[link].split("|")[0]; //Remove friendly name
          link = link.replaceAll(" ", "%20");

          //Add to pagelist object
          prefix = link.split(":")[0];
          if(prefix != "Category" && prefix != "File" && prefix != "wikipedia")
            if(level < ITERATIONS && !visitedPages.includes(arguments, link))
            {
              console.log(level + ": " + link)
              pageLinks[link] = getLinks(link, level+1, callback); //===Recursive call===
            }
        }
      }
    }
  });
  if(level == 0 && callback) callback();
  return pageLinks;
}

任何幫助表示贊賞,在此先感謝。

**編輯:**鏈接: https//github.com/JakeStanger/Wikipedia-Mapper/blob/master/init.js#L53

遞歸調用需要像這樣:

var counter = 0;
//the big for loop
counter++;
getLinks(link, level + 1, function(res) {
    for (var key in res) { //with an array it would be concat...
        pageLinks[key] = res[key];
    }
    counter--;
    if (counter == 0 && callback) callback(pageLinks); //callback if all callbacks called
});

同時刪除此奇怪的代碼:

if(level == 0 && callback) callback();

不,你可以做:

getLinks(START_PAGE, 0, console.log);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM