Nodejs的事件驱动异步回调
Posted
技术标签:
【中文标题】Nodejs的事件驱动异步回调【英文标题】:Event-driven asynchronous callbacks of Nodejs 【发布时间】:2013-07-07 21:50:06 【问题描述】:我正在阅读 Node Beginner Book。在事件驱动的异步回调一章中,作者举了一个例子来说明异步回调的思想。代码示例如下:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
database.query添加回调函数后,代码变为异步:
database.query("SELECT * FROM hugetable", function(rows)
var result = rows;
);
console.log("Hello World");
我的问题是为什么 database.query() 函数在添加回调函数后就变成了异步的。 我之前对 javascript 和 JQuery 没有经验,这可能是我看不懂的原因。
【问题讨论】:
【参考方案1】:node.js 中有很多函数同时具有异步风格和同步风格。例如,读取文件(docs)的内容有两种方式:
//asynchronous
fs.readFile("filename.txt", function(err, data)
);
//synchronous
var data = fs.readFileSync("filename.txt");
作者提供的示例实际上看起来有些混乱,但database.query
可能会根据是否将callback
作为第二个参数传入而进行异步调用。
例如,可以这样实现:
function query(queryString, callback)
if(callback !== undefined)
queryInternal(queryString, callback);
return;
else
return queryInternalSync(queryString);
一般来说,我认为惯例是function
是asynchronous
或synchronous
(不是两者),所以你的直觉是正确的。
请注意,在synchronous
的情况下,console.log
将在result
具有查询的内容之后执行,而在asynchronous
的情况下,console.log
将在query
函数返回时和之前执行callback
被执行。
【讨论】:
【参考方案2】:Asynchronously
表示 waits
不是 response
并转到下一个语句
被执行
在您的第二个示例中,回调函数在执行此操作时处理您的响应,
它不会等待,console.log("Hello World");
在console
中显示output
。
阅读:
http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ http://nodemanual.org/latest/nodejs_dev_guide/writing_asynchronous_code.html http://www.sebastianseilund.com/nodejs-async-in-practice【讨论】:
以上是关于Nodejs的事件驱动异步回调的主要内容,如果未能解决你的问题,请参考以下文章
物联网服务NodeJs-5天学习第一天篇④ ——了解NodeJs回调函数和事件驱动机制