Node.js Readline暂停代码

时间:2017-07-30 17:51:16

标签: javascript node.js readline

抱歉,我刚刚踏上JavaScript,目前正试图从控制台收集用户输入。我有一个看起来像这样的代码:

include 'lib/simplehtmldom.php';

因此,如果我尝试运行它,它会显示:

$(function () {
var chart = new Highcharts.Chart({
    chart: {
        renderTo: 'container',
        type: 'line',
        marginLeft: 30
    },
    title: {
        text: null
    },
    legend: {
        enabled: false
    },
    xAxis: {
        categories: ['1990', '1991', '1992', '1993', '1994', '1995'],
        tickmarkPlacement: 'on',
        tickInterval: 1,
        tickPosition: 'inside',
        tickLength: 2
    },
    yAxis: {
        lineWidth: 1,
        tickWidth: 1,
        tickPosition: 'inside',
        tickLength: 2,
        min: 0,
        max: 200,
        tickInterval: 50,
        gridLineWidth: 0
        /*,offset:-26*/
    },
    plotOptions: {
        line: {
            marker: {
                enabled: false
            }
        }
    },
    series: [{
        data: [100, 125, 150, 125, 90]
    },{
        data: [100, 80, 90, 80, 70]
    },{
        data: [100, 90, 80, 60, 180]
    }]
});

然后等我输入。显然main = () => { var num = getInput(); console.log(num); } getInput = () => { const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Lemme test: ', (ans) => { rl.close(); return ans; }); } main(); Lemme test: undefined 完成之前运行,或者console.log(num);吐出getInput();然后请求输入。

BTW切换getInput();undefined不起作用。

为什么会这样?

2 个答案:

答案 0 :(得分:0)

这是因为节点不等待readline获取输入 - 就像Node中的几乎所有内容一样,它是异步的。因此它会触发用户输入请求并继续执行该程序。一旦有一些用户输入,如果触发你给它的回调。因此,要处理这个问题,您需要管理回调中的use输入,或者在回调中调用一个函数来异步处理输入。例如:

main = () => {
    var num = getInput();
}

dealWithInput = (str) => {
    console.log(str)
}

getInput = () => {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.question('Lemme test: ', (ans) => {
        rl.close();
        dealWithInput(ans);
    });
}

main();

答案 1 :(得分:0)

这是因为getInput函数是一个回调,这意味着它在将来的某个时刻被执行,因此console.log(不是回调)被执行之前。

当您将其分配给另一个函数时,它是一个回调函数或方法:

let example = () => {
   // This is a callback
}

doSomething(result => {
   // This is a callback too because its the same as doing the following
})

doSomething(function(result){
   // This is a callback without arrow functions
})