Ошибка при использовании волоконно-зависимого модуля wait.for npm в Node.js

Я использую библиотеку wait.for, чтобы избавиться от некоторых асинхронных вызовов. Я делаю это, потому что мне не особо важно, чтобы мой сервер работал эффективно или что-то еще, я использую 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.for или волокнами узлов, мог бы мне очень помочь.

1 ответ

Я думаю, что вы могли бы сделать это:

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

Другие вопросы по тегам