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);
  

一般来说,我认为惯例是functionasynchronoussynchronous(不是两者),所以你的直觉是正确的。

请注意,在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入门总结二:事件驱动

node 简介

物联网服务NodeJs-5天学习第一天篇④ ——了解NodeJs回调函数和事件驱动机制

每日灵魂一问nodejs-eventEmitte是啥?手动实现

如何优雅的处理Nodejs中的异步回调

NodeJS中的异步I/O事件驱动