首页 > 解决方案 > 我应该如何调用这个 node.js 函数?

问题描述

我正在关注 Node.js 教程,它给了我以下代码开始:



process.stdout.write("I'm thinking of a number from 1 through 10. What do you think it is? \n(Write \"quit\" to give up.)\n\nIs the number ... ");

let playGame = (userInput) => {
  let input = userInput.toString().trim();
    testNumber(input);
};

它要求我完成该应用程序,所以我这样做了,它奏效了:

process.stdin.on('data', (userInput) => {
  let input = userInput.toString()
  playGame(input)
  //console.log(input)
});

但是,当我单击“检查您的工作”按钮时,它说我做错了。正确的答案最终是这样的:

process.stdin.on('data', (userInput) => {
  let input = userInput.toString()
  //console.log(input)
});

process.stdin.on('data', playGame)

我对此有几个问题。1. 为什么playGame方法需要在监听器中调用,而不是在抓取用户数据的同一个方法中显式调用?2. 为什么这个例子没有创建竞态条件?以“数据”名称发出的事件不会同时触发吗?抱歉,如果这些是基本问题,只是想了解我正在学习的内容。提前感谢您的任何见解。

标签: javascriptnode.js

解决方案


您的教程中的确切说明是什么?

process.stdin是 a Stream,而后者又是EventEmitter。当data发射器发出事件时,将执行事件回调data。以下是文档所说的emit()

同步调用为名为 eventName 的事件注册的每个侦听器,按照它们注册的顺序,将提供的参数传递给每个侦听器。

据我了解,这两种解决方案在功能上是等效的——更具体地说,将代码拆分为两个单独的回调将不允许事件循环在两者之间执行任何其他代码。请注意,您仍在使用您的解决方案进行冗余字符串转换。

此外,没有竞争条件,因为回调将按照注册的顺序一个接一个地执行。在 javascript 执行模型中实际上只有一个执行线程——因此基本上只有一段 javascript 代码可以在任何给定时间点执行。


推荐阅读