Nodejs如何知道同步还是异步

时间:2016-08-16 18:22:07

标签: node.js

我理解回调是什么以及异步意味着什么,我没有得到的是如何在节点中运行异步函数。

例如,这是怎么回事?

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);

我想在第一个例子中我是异步进行的,但我不知道Node如何知道何时进行同步或异步...这是回归的问题吗?或者在同步模式下我们正在做var x = func(data);

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

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

3 个答案:

答案 0 :(得分:2)

  

我想在第一个例子中我是异步地做...

你的第一个例子不是异步的:)只是传递一个回调并在你完成后调用它不会使函数异步。

异步意味着,基本上,你告诉Node:“在这里,为我做这件事,并在我继续做其他事情时告诉我你什么时候”

您的示例未将任何内容交给Node以供将来完成。它正在进行计算并在此之后立即调用回调。这在功能上与您的第二个示例相同,您将返回计算结果。

但是,您可以将第一个示例更改为 异步的内容:

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

在这里,您告诉Node使用setTimeout延迟调用回调一秒钟。与此同时,Node不会等待一秒钟;它会愉快地接受更多的HTTP请求,每个请求都会在发送响应之前延迟一秒。

  

何时使用同步或异步?

异步代码是“病毒式的”:如果依赖异步函数,那么使用这些函数的代码也必须是异步的(通常通过接受回调,或者使用其他机制来处理异步性,比如promises )。

  

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

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

答案 1 :(得分:0)

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

节点实际上并不关心你运行的是什么代码。您可以阻止或不阻止(blocking/non-blocking)。

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

答案 2 :(得分:0)

如果您希望函数异步工作,则可以使用promises来实现,请看下面的代码:

function is_asynch(){
   return new Promise((resolve,reject)=>{
      resolve( here_your_synch_function() )
})
}