在Node.js中依次从API提问和返回答案?

时间:2018-07-23 19:32:49

标签: javascript node.js asynchronous synchronous

我正在从事的项目基本上是询问用户要定义的单词,然后程序插入并使用API​​返回这些定义。

我要完成的工作是这样的:

  1. 向用户询问首字母
  2. 获取用户输入,并将其输入到API
  3. 检索并打印API结果

  4. 向用户询问他们想要定义的另一个单词(或者,如果用户键入“ exit app”,程序将关闭)

  5. 检索并打印API结果
  6. 循环浏览4和5,直到用户键入“退出应用”

我正在Node中运行它,无法复制上面的流程。 API功能很好,但是在返回第一个问题的结果之前会向用户询问第二个问题。我希望仅在检索并打印出第一个问题的结果后才问第二个问题。

我一直在以各种方式对代码进行排序,例如将询问第二个问题的功能放在询问第一个问题的功能的代码块的末尾,最后将第二个问题打印在第一个问题的结果之前已经获得了一个。

我对这个问题的理解是,它与Node的异步特性有关,但是我不确定如何实现所需的流程。是将promise纳入代码中还是使用异步模块之类的东西?还是不可能?

我用于字典查询的当前代码块:

var dict = new Oxford(config);

var dictQuery = function(word) {
    var lookup = dict.definitions(word);
    return lookup.then(function(res) {
        var results = res.results;
        var lexicalEntries = results[0]['lexicalEntries'];
        for(var i=0; i < lexicalEntries.length; i++) {
            var objectContainingEntries = lexicalEntries[i];
            var entries = objectContainingEntries['entries'];
            var objectContainingSenses = entries[0];
            var senses = objectContainingSenses['senses'];
            for(var j=0; j < senses.length; j++) {
                var objectContainingDefs = senses[j];
                var defsList = objectContainingDefs['definitions'];
                for(var k=0; k < defsList.length; k++) {
                    var definition = defsList[k].trim();
                }
                console.log("- " + definition);
            }
        }
    })
};

The dictionary module I'm using seems to suggest var lookup returns a promise.

我当前遇到的问题的代码块:

var askUser = function() {
    rl.setPrompt("Please enter the word you would like to define: ");
    rl.prompt();
    rl.on('line', function(word) {
        dictQuery(word.toLowerCase().trim());

        askAgain();
    })
}

var askAgain = function() {
    rl.setPrompt("Is there another word you would like to define? (enter word, or type 'exit app' to leave) ");
    rl.prompt();
    rl.on('line', function(nextWord) {
        if (nextWord.toLowerCase().trim() === 'exit app') {
            rl.close()
        } else {
            dictQuery(nextWord);
            askAgain();
        }
    })
}

askUser();

感谢您提供任何见解和帮助!

*注意:我认为我的问题与标记为可能重复的问题有所不同,因为在我的情况下,第二个函数不需要将第一个函数生成的数据输入到其中。

0 个答案:

没有答案