我正在尝试学习异步/承诺/回调/js模块/等等……然而,当我试图运行一个只需要一个文件的简单模块,并运行一个只返回参数的函数时,node没有正确输出结果。我的意思是,它有时只返回值,有时不返回值。
我是新手,所以我可能是错的,但据我所知,这是节点(?)中的异步。但在研究过程中,我只在使用async的列表中找到了执行加载、等待、超时等操作的函数。但是似乎我在node中运行的所有东西,无论多么简单,都是异步运行的,并且不会一致地输出值?以下是我在节点控制台中运行和接收到的内容的示例:
> function test(input){
... return input;
... }
> test('a')
> test('a')
'a'
>
> test(5)
> test(5)
5
>
就像我说的,我正在努力学习一些东西,但它是从查看模块开始的,所以我也想知道一个常见的“模式”(?)用于处理此问题的方法是,在导出模块时。谢谢。
编辑:
我不确定我是否说得很清楚,但在大多数情况下,我真的只是想知道为什么像这样简单的函数不能工作,而我看到人们谈论异步的唯一函数是明显在等待的函数,在某种意义上。不是像这样的简单函数。我还没有尝试用这个回调,但我假设它是有效的。我只是不认为你需要它们来完成这么简单的功能?
发布于 2017-03-30 02:26:22
这就是Node REPL中的相同输入对我的工作方式:
> function test(input){
... return input;
... }
undefined
> test('a')
'a'
> test('a')
'a'
> test(5)
5
> test(5)
5
>
在您的示例中,test()
函数不是异步的。它同步返回值。不过,您包含的REPL会话看起来并不合理,因为您的函数定义应该像我的示例中那样返回undefined
。
回答你的问题:并不是所有的Node函数都必须是异步的。每个简单返回值的函数都是同步的,比如Math.sin()
等。
为了更好地理解这一切,请看这个答案,它显示了同步和异步函数的示例,逐步解释了执行顺序:
发布于 2017-03-30 03:16:07
使用像这样的东西
function test(input,callback){
return callback(input);
}
test('a',function(s){console.log(s)})
发布于 2017-03-30 02:41:08
根据您的问题,您正在使用的函数不是异步函数,也不会模拟异步操作。它会一直阻塞,直到返回结果。
不要被cli返回的结果搞糊涂了;有时候出现这种情况是很正常的。然而,异步操作用于提取节点中的长时间运行的操作,诸如数据库请求、文件i/o请求、在线信息请求等,其在稍后时间返回信息。
更合适的方法是使用带有回调的函数,使用es7异步,等待或使用事件发射器。这些是在节点中处理异步操作的唯一方法。
您可能想要阅读beginning node js
https://stackoverflow.com/questions/43101054
复制相似问题