我读过一些关于这些东西的文章。但是,我仍然陷入困境。例如,我有两个功能:
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
似乎更难看。
我的观点有什么问题?
答案 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 。