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 World
logging到屏幕上。
所以当你说
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
。 你可以使用Promise , co例程或库asynchronous 。