nodejs – 何时使用asynchronous而不是同步function?

我读过一些关于这个东西的文章。 不过,我仍然陷在一个点上。 比如我有两个function:

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似乎更丑陋。

我的观点有什么问题?

nodejs默认是asynchronous的,这意味着它不会像其他语言那样执行语句

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

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

所以当你说

 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方式中,作为parameter passing的函数称为callback函数,这意味着只要getDataAsync()完成其执行

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

在你的第一个例子中,这个线程在这个时候会被阻塞,直到从db中获取数据

db.query("some query");

在第二个例子中,线程不会被阻塞,但可用于提供更多的请求。

 { return JSON.stringify(result); } 

这个函数会在数据库中有数据时立即被调用。

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

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

就像你在电饭煲前闲着直到熟了一样。 一般来说,你会做饭,其他活动,而大米正在做饭。 吹口哨时,可以用米饭做任何事情。 同样的,NodeJS会将asynchronous操作发送到事件循环,这将在操作结束时使我们感到亲密。 同时Node.js可以像处理其他连接一样处理其他操作。

你说得Ugly 。 asynchronous并不意味着只使用callbacks 。 你可以使用Promiseco例程或库asynchronous