javascript - 使用 Nodejs 的多个用户输入

标签 javascript node.js asynchronous

我正在尝试编写一个连续询问三个问题的脚本,同时在每个问题之间等待用户输入。
看来我很难理解如何利用 Node 的非阻塞特性来做到这一点。
这是我正在运行的代码:

var shell = require('shelljs/global'),
    utils     = require('./utils'),
    readline  = require('readline'),
    fs        = require('fs'),
    path      = require('path');

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

setUserDefaultSettings();

function setUserDefaultSettings() {
    var defaultSettingsFile = find('DefaultSettings.json');
    var defaultSettingsJSON = [
        {
            macro: '__new_project_path__',
            question: 'Please enter the destination path of your new project: '
        },
        {
            macro: '__as_classes_path__',
            question: 'Please enter the path to your ActionScript Classes: ',
        },
        {
            macro: '__default_browser_path__',
            question: 'Please enter the path to your default browser: '

        }
    ];
    var settingsKeys = [];
    var index        = 0;

    if (!test('-f', 'UserSettings.json')) {
        cp(defaultSettingsFile, 'UserSettings.json');
    }

    var userSettingsFile = pwd() + path.sep + find('UserSettings.json');

    fs.readFile(userSettingsFile, 'utf8', function (err, data) {
        if (err) {
            echo('Error: ' + err);
            return;
        }
        data = JSON.parse(data);

        for(var attributename in data) {
            settingsKeys.push(attributename);
        }

        defaultSettingsJSON.forEach(function(key) {
            index++;
            // Check if macros have been replaced
            if (data[settingsKeys[index - 1]] === key.macro) {
                // Replace macros with user input.
                replaceSettingMacro(userSettingsFile, key.macro, key.question);
            }
        });
    });
}

function replaceSettingMacro(jsonFile, strFind, question) {
    askUserInput(question, function(strReplace) {
        sed('-i', strFind, strReplace, jsonFile);
    });
}

function askUserInput(string, callback) {
    rl.question(string, function(answer) {
        fs.exists(answer, function(exists) {
            if (exists === false) {
                echo('File ' + answer + ' not found!');
                askUserInput(string, callback);
            } else {
                callback(answer);
            }
        });
    });
}

仅询问第一个问题,因为脚本会在用户输入答案时继续执行。我明白为什么会这样,但不知道如何解决这个问题。

最佳答案

这看起来是实现队列的合适位置。队列将一次启动一个任务,只有在前一个任务完成后才开始下一个任务。

在你的 askUserInput 方法中尝试类似的东西:

var questionQueue = [];
function askUserInput(string, callback) {
    if(questionQueue.length == 0) {
        rl.question(string, function(answer) {
            fs.exists(answer, function(exists) {
                if (exists === false) {
                    echo('File ' + answer + ' not found!');
                    askUserInput(string, callback);
                } else {
                    callback(answer);

                    if(questionQueue.length > 0){
                        var question questionQueue.shift();
                        askUserInput(question.string, question.callback);
                    }
                }
            });
        });
    }
    else {
        questionQueue.push({string: string, callback: callback});
    }
}

另一个选项包括将您的回调进一步扩展到调用堆栈的上方,并在您收到前一个问题的回调时调用下一个问题。

关于javascript - 使用 Nodejs 的多个用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22849237/

相关文章:

node.js - 如何使用 Ebay 的刷新 token 获取访问 token ?

android - 按照教程后无法安装react-native-cli

javascript - Array.prototype.map() 之后的下一个函数可以安全地假设映射中的所有回调都已返回吗?

javascript - 如何创建缩放适合谷歌地图标记?

javascript - 使用数据库结果数组 codeigniter 填充 html 表单

javascript - 滚动所有嵌套的滚动条以将 HTML 元素带入 View

javascript - 无法为 Highstock API 设置系列中的单个点颜色,它适用于 Highchart API

node.js - 在 mongoose/mongodb/node 中使用异步回调循环

reactjs - Jest 的回调测试实际上是如何工作的

c# - Task.RunSynchronously() 工作 "recursively"吗?