Является ли wor dnet .lookup функцией asyn c? Попытка построить массив синонимов для каждого слова в предложении с wor dnet и Natural - PullRequest
1 голос
/ 30 января 2020

Итак, я впервые пытаюсь использовать wor dnet для создания сценария распознавания текста для небольшого текстового приключенческого игрового проекта, над которым я работаю. Прямо сейчас у меня есть этот код, чтобы попытаться построить объект, который состоит из каждого слова в качестве ключа и каждого синонима к этому слову в виде массива, присоединенного к этому ключу:

const natural = require('natural');
const wordnet = new natural.WordNet();

let s = "Inspect the room";
function resultCheck(sentence) {
    a = sentence.split(' ');
    let sObj = {};
    a.forEach(word => {
        sObj[word] = [];
        wordnet.lookup(word, function (details) {
            details.forEach(function (detail) {
                sObj[word].push(detail.synonyms);
            });
            sObj[word] = sObj[word].join().split(',');
            console.log(sObj);
        });
    });
    return sObj;
}
let newOb = resultCheck(s);
console.log(newOb);

Консоль регистрирует массивы Синонимы строятся правильно, но возвращаемый объект - это просто ключи с пустыми массивами. Я попытался использовать async / await несколькими способами, но безуспешно. Есть идеи?

1 Ответ

0 голосов
/ 31 января 2020

Это предварительно ES6 JS. Это не asyn c в смысле async / await или на основе обещаний. sr c Но это асин c, в котором полно рекурсивных обратных вызовов.

РЕДАКТИРОВАТЬ: Как делать то, что вы хотите:

Несмотря на то, что я использую функции const и arrow, это очень старая школа Javascript, в которой вы должны навязывать порядок выполнения путем вложения обратных вызовов. Также, извините за добавление loda sh, но я просто всегда к нему обращаюсь; Я не знаю, как использовать JS без него.

const natural = require('natural');
const _ = require('lodash')


const wordnet = new natural.WordNet();
const tokenizer = new natural.WordTokenizer();


const sent = "Welcome to callback hell."
const setSyns = {}

const handleLookup = (word, syns) => {
    setSyns[word] = syns
}

const doLast = () => {
    console.log(setSyns)
}

// callback to wordnet.lookup gets passed an array of objects
// one property of which is `synonyms`

// also, use a tokenizer

tokenizer.tokenize(sent).forEach((word, idx, words) => {
    wordnet.lookup(word, x => {
        synsList = _.flatMapDeep(x, y => y.synonyms)
        handleLookup(word, _.uniq(synsList))
        if (idx == words.length - 1) {
            doLast()
        }
    })
})

console.log(setSyns)  // logs {} because this is executed before the loop is done

...