nodejs - 何时使用异步而不是同步功能?

时间:2014-07-29 09:17:18

标签: node.js asynchronous

我读过一些关于这些东西的文章。但是,我仍然陷入困境。例如,我有两个功能:

function getDataSync(){
    var data = db.query("some query");
    return JSON.stringify(data);
}
function getDataAsync(){
    return db.query("some query",function(result){
        return JSON.stringify(result);
    });
}

人们说在IO界限中推荐使用asynchronous programming。但是,在这种情况下,我看不出任何不同之处。 Async似乎更难看。

我的观点有什么问题?

3 个答案:

答案 0 :(得分:2)

nodejs默认是异步的,这意味着它不会像其他语言那样按顺序执行语句,例如

database.query("SELECT * FROM hugetable", function(rows) {
  var result = rows;
});
console.log("Hello World");

在其他语言中,它将等到查询语句完成执行。 但是在nodejs中,它将分别执行查询语句并继续执行以将Hello World记录到屏幕上。

所以当你说

function getDataSync(){
    var data = db.query("some query");
    return JSON.stringify(data);
}

它将在db.query返回数据之前返回数据

function getDataAsync(){
    return db.query("some query",function(result){
        return JSON.stringify(result);
    });
}

但是在node.js方式中,作为参数传递的函数称为callback,这意味着只要getDataAsync()完成执行就会调用

我们在nodejs中使用回调,因为我们不知道db.query()何时完成执行(因为它们没有按顺序完成执行),但是当它完成时它将调用回调。

答案 1 :(得分:0)

在第一个示例中,此时线程将被阻止,直到从db

中检索数据

db.query("some query");

在第二个示例中,线程不会被阻止,但可以提供更多请求。

{
  return JSON.stringify(result);
}

只要数据可从db获得,就会调用此函数。

这就是为什么node.js被称为非阻塞IO的原因,这意味着你的线程永远不会被阻塞。

答案 2 :(得分:0)

当某些操作阻止执行时使用异步。它在多线程应用程序或服务器中不是问题。但NodeJS是单线程应用程序,不应该被单个操作阻塞。如果被db.query("some query");之类的操作阻止,Node.js将等待完成它。

类似于你只是在电饭煲前闲置,直到煮熟为止。一般来说,你会在煮饭时做其他活动。当吹口哨时,你可以用米饭做任何事情。类似地,NodeJS会将异步操作发送到事件循环,这将在操作结束时与我们建立联系。同时Node.js可以处理其他操作,如服务其他连接。

你说Ugly。异步并不意味着仅使用callbacks。您可以使用 Promise co routine 或图书馆 async