Node.jsasynchronous函数*定义*

请,只是为了清除我脑海中的某些东西

我习惯于在库中使用asynchronous函数来编写,但是如何编写我自己的?

为了说明我的问题,我编写了一个名为“MadMathz”的模块,

我知道以下是asynchronous函数的示例用法:

//load module var mM = require('./MadMathz'); //perform a function mM.async_function_addthree(12, function(result) { console.log(result) }); //do something straight afterwards console.log('Logging this straight after instead of waiting for computation'); 

我知道该函数的第二个参数是callback,但是如何定义一个函数,如“async_function_addthree”? 我们假设为了这个例子的目的,async_function_addthree只是给第一个参数加3。

我只是把自己搞糊涂了,试图写出我认为可能的东西。 我完全在错误的轨道上? 我觉得我接近node.js,但这需要清理。

请解释,而不是在可能的情况下将其链接到某处。 我相信别人会从这个问题中受益。

实际上,创build一个“ asynchronous ”function听起来有点奇怪,没有任何进一步的描述或要求。 通常,这个用法是避免长时间的阻塞 。 所以,如果我们有一个触发数据库查询的函数,并且当这个函数完成的时候我们想调用另一个函数,那么这个函数应该在作业完成后被调用并且原始函数立即返回控制stream返回到节点 (ECMAscript) 。

所以如果我们有一个像

 function someJob( callback ) { // heavy work callback(); } 

现在,这个代码仍然运行非常同步 。 为了使其处于asynchronous状态,我们可以调用节点的process.nextTick方法

 function someJob( callback ) { // heavy work process.nextTick( callback ); } 

现在发生的事情是,Node将在稍后通过其事件callback来执行该callback方法(并且它也有点智能)。 Eventho nextTick声称比setTimeout更有效率,与ECMAscript编码器的观点相差无几。 所以在浏览器中我们可以去

 function someJob( callback ) { // heavy work setTimeout( callback, 0 ); } 

如果说上面这个例子的方法根本没有什么意义,那么你会是对的,因为asynchronous状态发生繁重的工作之后。 那么,真的。 事实上,你需要把重要的部分分解成更小的和平,并且使用.nextTick()来实现这个效果。

这也是我开始混乱的原因,实际上每个任务已经为你提供了callback的可能性。

这不是node.js模块的代码,但我希望你明白了。

函数是JavaScript中的头等对象。 这就是为什么你可以将它们分配给variables并将它们传递给其他函数,如任何值。 一旦你有一个函数的引用,你可以通过在函数引用后面加上()来调用它。

例:

 function async_function_addthree(a, callback) { callback(a + 3); } 

这将第一个参数加3 ,然后调用第二个parameter passing结果给它。 请记住,您可以根据需要命名参数。 重要的是,第二个参数将保存一个你可以调用的函数。

但是请注意:接受callback的函数不是自动asynchronous的。 在这个例子中,代码仍然按照定义的顺序执行,例如,首先是async_function_addthree ,然后是callback,然后是调用async_function_addthree之后的所有东西,例如console.log

你可以添加一个setTimeout并调用callback延迟:

 function async_function_addthree(a, callback) { setTimeout(function() { callback(a + 3); }, 1000); } 

这将在一秒钟后调用callback。 Node.js甚至有更好的内置方法,请参阅jAndy的答案 。

但即使你的代码不是asynchronous的,使用callback可以是一个明智的deviseselect,因为它允许你轻松地改变函数的行为,并在不破坏现有代码的情况下使其asynchronous。

当你将一些工作委托给外部进程(或者可能在Node的C层工作),例如数据库查询,文件系统操作时,NodeJS进程的asynchronous性就会发生。

通常在普通的JavaScript函数中没有asynchronous性(Node.js是单线程的),但是没有多less有效的例子。 但是,如果真的很重,而且你真的想要这么做的话,你可以将你的工作委托给其他进程(参见child_process.fork)或者在setTimeout的帮助下分离操作(为了处理其他请求而给予进程呼吸),然后的确应该configuration为asynchronousfunction。

当我自己寻找答案时,我遇到了这个问题。

基本上,要在节点中编写一个asynchronous函数,你给它的一个参数应该是一个函数; 该函数稍后将在asynchronous函数中调用。

然后,当人们调用你的函数时,他们将能够定义该函数。

下面是我以同步方式编写的代码的一个示例,该代码不起作用,以及如何将其重写为asynchronous并实际工作。


以下代码不起作用:

 //synchronous function that doesn't work var google_request = function(animal_name, sessionid){ var options = { url: 'http://google.com', method: 'POST', json: { "animal": animal_name, "sessionid": sessionid } }; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { return body; } }); }; //use your function var body = google_request("ant", "session1") console.log(body); //this will return undefined 

下面的代码可以工作:

 //asynchronous function var google_request = function(animal_name, sessionid, callback_function){ var options = { url: 'http://google.com', method: 'POST', json: { "animal": animal_name, "sessionid": sessionid } }; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { callback_function(body); } }); }; //use your function google_request("ant", "session1", function(body){ console.log(body); )}; 

这可能不是最简单的例子,但是我对这个函数的改变非常简单, 我通过我的函数第三个参数,称为“callback_function”,而不是返回“身体”,我打电话给我身体上的callback_function。 然后下面我用通常的“节点”方式使用我的function,而不是同步的方式。

你也可以find这个线程的信息: 如何返回asynchronous调用的响应?