在Node.js中为npm模块使用光纤相关的wait.f时出错



我使用wait.fo库来消除一些异步调用。我这么做是因为我并不太关心服务器是否高效运行,我使用node.js使用Natural NLP npm模块进行一些数据处理。

无论如何,我递归地构建一个树,并为每个节点请求一篇维基百科文章。这个维基百科请求是异步的,我正试图通过调用wait.for(…)使其同步。如果递归调用只在一次激活后结束,则请求可以正常工作,但如果递归继续,则会引发错误。

从视觉上看,我指的是

 [ROOT]
 /  | 
[] [] [] <--- This level is fine ... No Errors
|
[]       <--- Error Here, on level 2

错误为:

/Users/me/Documents/Node Projects/Personal Website/node_modules/wait.for/waitfor.js:37
                                fiber.run();   //resume fiber after "yield"
                                      ^
TypeError: Cannot call method 'toString' of undefined
    at TfIdf.tfidf (/Users/me/Documents/Node Projects/Personal Website/node_modules/natural/lib/natural/tfidf/tfidf.js:132:42)
    at isIrrelevant (/Users/me/Documents/Node Projects/Personal Website/finalproject/wikitree.js:126:47)

以下是递归调用的代码:

var WikiTree = function(node) {
    this.name    = node.name;
    this.context = node.context;
    this.text    = node.article;
    if (node.children) {
        this.children = node.children;
    }
    function createArticleSummary(article) {
        // TODO: Must Implement
        return article;
    }
    function isIrrelevant(article, title, linkText) {
        // Tweak Here
        var articleTfIdf = new TfIdf();
        articleTfIdf.addDocument(article);
        var titleRelevanceToArticle = articleTfIdf.tfidf(title,0); // ERROR HERE: This is wikitree.js:126
        var textRelevanceToArticle = articleTfIdf.tfidf(linkText,0);
        var titleRelevanceToZen = zenTfidf.tfidf(title,0);
        var textRelevanceToZen = zenTfidf.tfidf(linkText,0);
        return ( titleRelevanceToZen / titleRelevanceToArticle >= 1 ) || ( textRelevanceToZen / textRelevanceToArticle >= 1 );
    }
    WikiTree.prototype.searchChild = function(child) {
        console.log("Searching for Link Title "" + child.title + "" And Link Text "" + child.linkText + """);
        var childQuery = {
            query : child.title,
            format : "html",
            summaryOnly : false
        };
        var childArticle = wait.for(wikipedia.searchArticle, childQuery);
        console.log("Got Wikipedia Response for " + child.title);
        var childWikiLinks = extractLinkedWikis(childArticle);
        console.log("Found " + childWikiLinks.length + " Links for " + child.title);
        for (var i = childWikiLinks.length - 1; i >= 0; i--) {
            if ( LinkTrie.contains(childWikiLinks[i].title) || LinkTrie.contains(childWikiLinks[i].linkText) ) {
                childWikiLinks.splice(i,1);
            } else if ( isIrrelevant( childWikiLinks[i] ) ) {
                childWikiLinks.splice(i,1);
            } else {
                LinkTrie.addStrings([ childWikiLinks[i].title, childWikiLinks[i].text ]);
            }
        };
        console.log("After pruning, " + childWikiLinks.length + " Links left for " + child.title);
        var newChildWT = new WikiTree({
            name : child.title,
            context : child.linkText,
            article : childArticle,
            children : createArticleSummary(childWikiLinks)
        });
        return newChildWT;
    };
    WikiTree.prototype.descend = function() {
        // Descend to the next level ... Meaning find the children of the current children (If there are any)
        if (!this.children) {
            console.log("Leaf at " + this.name);
            return;
        }
        for (var i = this.children.length - 1; i >= 0; i--) {
            if ( this.children[i].title.match(/Category:/) ) {
                console.log("Found 'Category:' at " + i + " in " + this.children[i].title);
                this.children.splice(i,1);
            } else
                this.children[i] = this.searchChild(this.children[i]);
        };
        console.log("Done With Descend For " + this.name);
    };
    this.descend();
};
var result = ...; // A String
var zenLinks = ...; // An Array of objects
// Actually make the first recursive call here
var zenTree = new WikiTree({
    name : 'Zen & The Art of Motorcycle Maintenance',
    article : result,
    children : zenLinks
});

无论如何,任何帮助都将不胜感激。谷歌搜索这个问题没有太大帮助,所以任何有wait.fo或node光纤经验的人都可以极大地帮助我。

我想你可以这样做:

var childArticle = wait.forMethod(wikipedia, 'searchArticle', childQuery);

最新更新