等待node.js中的用户输入

时间:2014-09-13 16:59:50

标签: javascript node.js user-input wait synchronous

我只是想提一下,我尝试了一些来自博客的技术来获取用户输入,但这些示例总是在一个只询问用户输入的程序的上下文中......并且它们总能工作但是它们会在那里工作。从来没有任何node.js问题继续到下一行代码,因为没有。

我必须得到用户输入,然后验证输入是否有效,所以我创建了这个构造:

while ( designAppealTest(subject) == false ) {
            subject[DESIGN_APPEAL] = ei.errorInput('designAppeal for the subject', iteration, subject[DESIGN_APPEAL])
        }

它调用的函数是:

module.exports.errorInput =  function (fieldName, iteration, originalValue) {
    originalValue = originalValue || 'false'
    console.log('\n\n' + fieldName + ' for the subject' + ' contains an invalid value in for #' + i)

    if (originalValue !== false)
        console.log('original value of field = ' + originalValue)

    console.log('\nPlease enter a new value for it:\n')

    process.stdin.on('data', function (text) {
        console.log('received data:', text);
        return text;
    });

}

除了在用户有机会输入值之前继续通过while循环之外,这是有效的。所以我看到的是提示用户每秒输入40,000次的值。在继续循环之前,如何使node.js等到输入值?构造本身是错误的还是因为我没有阻止它异步?

CFrei:

好的,我还在check()本身添加了一个回调:

checkedSubject = check(subject, function(v) {
            return v;
        });

        console.log('checkedSubject = ' + checkedSubject)

        function check(listing, callback) {
            if (designAppealTest(subject) == false ) {
                ei.errorInput('designAppeal', iteration, listing[DESIGN_APPEAL], function(v) {
                    listing[DESIGN_APPEAL] = v;
                    check(listing)
                    });
            } else {
                callback(listing);
            }
        }

我仍然遇到同样的问题 - 它会要求输入,但会立即执行所有操作。

3 个答案:

答案 0 :(得分:5)

由于这个问题有点陈旧,但我猜它仍然会获得来自谷歌的大量流量:你应该看看nodejs readline

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('What do you think of Node.js? ', (answer) => {
  // TODO: Log the answer in a database
  console.log(`Thank you for your valuable feedback: ${answer}`);

  rl.close();
});

答案 1 :(得分:0)

这就是node.js的工作原理,它围绕异步,非阻塞I / O设计,以实现高并发性。如果由于node.js的工作方式需要帮助来组织控制流程,您可能会考虑使用async等模块。

答案 2 :(得分:0)

嗯,异步方法是关于"永远不会回来"到任何返回值,只需给该函数下一个回调。你的"循环"看起来应该是这样的:

function check() {
    if (designAppealTest(subject) == false ) {
            ei.errorInput('designAppeal for the subject', iteration, subject[DESIGN_APPEAL], function(v) { subject[DESIGN_APPEAL] = v; check() })
    }
}

(请注意模拟你的&#34的递归调用;而"。)

而不是

return text;

你调用那个函数(让我们命名为cb):

cb(text)

是的,像async或Promise-Library这样的libs有助于使这看起来更好看。