Javascript 节点读线输入重叠

Javascript 节点读线输入重叠,javascript,node.js,readline,Javascript,Node.js,Readline,当我有多个readline对象时,即使它们在同一个闭包中打开和关闭,我最终也会看到奇怪的行为 在我正在练习制作的tick tac-toe游戏中,我遇到了一个问题,readline.interface.question在不接收输入和不输入回调的情况下终止 在下面的案例中,我试图隔离问题,提示偶尔会重复我的输入(例如,键入“1”将导致“11”) 如何同步使用readline.interface.question const EventEmitter = require('events'); cons

当我有多个readline对象时,即使它们在同一个闭包中打开和关闭,我最终也会看到奇怪的行为

在我正在练习制作的tick tac-toe游戏中,我遇到了一个问题,
readline.interface.question
在不接收输入和不输入回调的情况下终止

在下面的案例中,我试图隔离问题,提示偶尔会重复我的输入(例如,键入“1”将导致“11”)

如何同步使用
readline.interface.question

const EventEmitter = require('events');
const readline = require('readline');



function Emitter() {
    EventEmitter.call(this);
    this.val = 1;
    this.ping = () => {
        console.log(this.val);
        readAndPrint(() => {
            this.emit('emit');
        });
    }

    this.setEmitter = (emitter) => {
        emitter.on('emit', this.ping);
    }

    const readAndPrint = (callback) => {
        const reader = readline.createInterface({
            input: process.stdin,
            output: process.stdout,
        });

        reader.question('Enter a string: ', (answer) => {
            reader.close();
            console.log(answer);
            callback();
        })
    }
}
Emitter.prototype.__proto__ = EventEmitter.prototype;




let one = new Emitter();
let two = new Emitter();
let three = new Emitter();
one.setEmitter(three);
two.setEmitter(one);
three.setEmitter(one);

one.ping();

我的猜测是,因为当您设置发射器时,所有this.ping都是由相同的“emit”触发的。因此,在您的one.ping()之后,回调触发一个“emit”,而this.ping持续两次,三次在一次关闭后停止

你可以尝试给每个发射器一个id,这样它们就不会触发每个发射器的this.ping

const EventEmitter = require("events");
const readline = require("readline");

function Emitter(id) {
    EventEmitter.call(this);
    this.val = 1;
    this.id = id;
    this.ping = () => {
        console.log(this.val);
        readAndPrint(() => {
            this.emit("emit" + this.id);
        });
    };

    this.setEmitter = emitter => {
        emitter.on("emit" + this.id, this.ping);
    };

    const readAndPrint = function(callback) {
        const reader = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });

        reader.question("Enter a string: ", answer => {
            reader.close();
            console.log(answer);
            callback();
        });
    };
}
Emitter.prototype.__proto__ = EventEmitter.prototype;

let one = new Emitter(1);
let two = new Emitter(2);
let three = new Emitter(3);
one.setEmitter(three);
two.setEmitter(one);
three.setEmitter(one);

one.ping();
下面是一个片段,让您更好地了解正在发生的事情。 基本上,您的代码调用1.ping(),它关闭,然后从回调“emit”发出2.ping和3.ping

要同步执行此操作,可以使用如下回调:

const EventEmitter = require("events");
const readline = require("readline");

function Emitter(id) {
    EventEmitter.call(this);
    this.val = 1;
    this.id = id;
    this.ping = cb => {
        readAndPrint(() => {
            this.emit("emit" + this.id);
            if (cb) {
                cb();
            }
        });
    };

    this.setEmitter = emitter => {
        emitter.on("emit" + this.id, this.ping);
    };
    this.removeListener = emitter => {
        emitter.removeListener();
    };

    const readAndPrint = callback => {
        const reader = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });

        reader.question("Enter a string: ", answer => {
            console.log("my id is: ", this.id);
            reader.close();
            console.log(answer);
            callback();
        });
    };
}
Emitter.prototype.__proto__ = EventEmitter.prototype;

let one = new Emitter(1);
let two = new Emitter(2);
let three = new Emitter(3);
one.setEmitter(three);
two.setEmitter(one);
three.setEmitter(one);

one.ping(() => two.ping());
const EventEmitter = require("events");
const readline = require("readline");

function Emitter(id) {
    EventEmitter.call(this);
    this.val = 1;
    this.id = id;
    this.ping = cb => {
        readAndPrint(() => {
            this.emit("emit" + this.id);
            if (cb) {
                cb();
            }
        });
    };

    this.setEmitter = emitter => {
        emitter.on("emit" + this.id, this.ping);
    };
    this.removeListener = emitter => {
        emitter.removeListener();
    };

    const readAndPrint = callback => {
        const reader = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });

        reader.question("Enter a string: ", answer => {
            console.log("my id is: ", this.id);
            reader.close();
            console.log(answer);
            callback();
        });
    };
}
Emitter.prototype.__proto__ = EventEmitter.prototype;

let one = new Emitter(1);
let two = new Emitter(2);
let three = new Emitter(3);
one.setEmitter(three);
two.setEmitter(one);
three.setEmitter(one);

one.ping(() => two.ping());