2016-08-16 191 views
1

我明白回调是什么以及异步意味着什么,我没有得到的是如何在节点中运行异步功能。Nodejs如何知道是同步还是异步

例如,这是怎么

var action = (function(data,callback) { 
    result = data+1; 
    callback(result); 
}); 

http.createServer(function (req, res) { 
    action(5, function(r){ 
     res.end(r.toString()); 
    }); 
}).listen(80); 

从这个

var action = (function(data) { 
    result = data+1; 
    return result; 
}); 

http.createServer(function (req, res) { 
    var r = action(5); 
    res.end(r.toString()); 
}).listen(80); 

不同?

我想在第一个例子中,我正在异步做它,但我不知道节点如何知道什么时候做同步或异步...是否是返回的问题?或者在同步模式下我们正在做的事实var x = func(data);

还有:何时使用同步或异步?因为显然你不想在添加+1时使用它......只是在执行IO任务时才使用异步,比如从DB读取数据?

例如,我正在使用库加密来加密一个短字符串(最多50个字符),这是一个很好的例子,我应该已经在使用异步了吗?

回答

1

我想在第一个例子中,我以异步方式做...

你的第一个例子是不是异步:)只是一个传递的回调并调用它,当你做了没有按”使一个功能异步。

异步意味着,基本上,你告诉节点:“在这里,为我做这件事,并让我知道你什么时候完成,而我继续做其他的东西”

你的例子并没有把任何东西交给Node来完成。它正在进行计算并在此之后立即调用回调。这与您的第二个示例在功能上相同,其中返回计算结果。

但是,您可以在第一个例子改变的东西,异步:

var action = (function(data,callback) { 
    setTimeout(function() { 
    result = data + 1; 
    callback(result); 
    }, 1000); 
}); 

在这里,你告诉节点延迟调用回调1秒,使用setTimeout。同时,Node不会等待一秒钟;它会高兴地接受更多的HTTP请求,并且在响应发送之前每个请求都会延迟一秒。

何时使用同步或异步?

异步代码为“病毒性”:如果你依靠可异步功能,即使用这些功能,你自己的代码也必须是异步(一般通过接受回调,或使用其他机制来处理异步,就像承诺一样)。

例如,我正在使用库加密来加密一个短字符串(最多50个字符),这种情况是一个很好的例子,我应该已经在使用异步了吗?

这取决于您正在使用的功能。 AFAIK,crypto中的大多数加密函数都不是异步的,所以你不能让它们自己异步。

+0

好的,那么我完全误解了所有的东西......假设我有一个函数做了几件事情,我希望它在'后面'运行,这样它就不会阻塞主循环,一旦完成,我想要运行回调操作。那我该怎么办?用0ms设置超时? –

+0

@CarlosNavarro可能['setImmediate'](https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)。但是,您应该意识到使用它不会奇迹般地让您的代码不会阻止事件循环。最后,JS是单线程的,所以它一次只能“做”一件事。 – robertklep

0

这两个示例都将同步工作。简单的异步操作是setTimoutsetInterval

节点实际上并不关心你在运行什么代码。您可以区块与否(blocking/non-blocking)。

换句话说 - 你有event loop。如果你的进程是异步的,他会将程序控制传递给事件循环,因此它可以执行任何其他需要完成的动作节点。如果没有 - 他不会。

相关问题