不确定Node.js代码是否是asynchronous的

我正在运行一个简单的node.js应用程序,它在http post上发送一个JSON对象。 该应用程序使用node-mysql和express模块​​。

这是代码。

HTML:

$(document).ready(function () { setInterval(function() { var path = window.location.pathname; $.ajax({ url: path, type: "POST", contentType: "application/json", processData: false, complete: function (data) { var a = JSON.parse(data.responseText); var display = "<ul style='list-style-type:none'>"; var count = 1; for (var key in a) { if (a.hasOwnProperty(key)) { var str = a[key].split('|'); display += "<li style='background: #333; margin: 10px 0;'>" + str[0] + " <span style='color:#ddd;'>to " + str[1] + "</span></li>"; count++; } } display += "</ul>" $('#output').html(display); } }); }, 3000); }); 

页面configuration:

 app.get('/', function(req,res) { res.sendfile(__dirname + '/index.html'); }); app.get('/docs', function(req,res) { res.sendfile(__dirname + '/display.html'); }); app.get('/bio', function(req,res) { res.sendfile(__dirname + '/display.html'); }); app.get('/int', function(req,res) { res.sendfile(__dirname + '/display.html'); }); 

还有一个app.post方法用于根据页面请求发送JSON对象。 有四个根,这只是指向/ docs,/ bio和/ int的链接列表。

 app.post('/docs', function(req, res){ var query = "/* query */"; connection.query(query, req.body, function(err, rows, fields) { if (err) throw err; var obj = {}; var id = ""; for (var i = 0; i < rows.length; i++) { id = "id" + i; obj[prop] = rows[i].name + '|' + rows[i].counter_name; } res.send(JSON.stringify(obj)); }); }); 

应用程序运行似乎更新正常,但我不确定它是否是asynchronous的。 基本上,只是需要知道是否是这样,而不是一些指针。

节点中的经验法则:除非方法名称中出现“sync”这个词,否则所有的 IO都是asynchronous的。 这实质上是节点的要点。

IO包括任何时候必须打开的文件,其中包括所有连接,包括HTTP连接,SQL连接,RabbitMQ连接等,以及磁盘上的所有文件,包括日志文件等。

通常要理解asynchronous代码,您应该查找callback的位置。 在Javascript中,callback经常被作为匿名函数给出。 例如

 connection.query(query, req.body, function(err, rows, fields) { // ^ anonymous function definition 

最后一个参数是callback。 一般来说,我将定义一个callback函数作为一个parameter passing给另一个函数(通常,但不总是,作为一个匿名函数)。当整行代码执行时,callback当然不会被调用。 当query的定义称为调用它的时候调用它,在这种情况下这将意味着在收到对查询的响应之后,这可能是几秒钟之后,特别是在执行以下代码之后,以及在远处的调用堆栈远。

callback是需要实现asynchronous的,因为在调用connection.query之后,响应还没有到来。 所以对响应做任何事情都是不可能的,无论是错误还是行。 这需要稍后发生,即asynchronous。 所以你稍后再回过头来处理。

使用console.log来代码化是一种快速且肮脏的方式来演示某些函数是asynchronous运行的:

 console.log("before"); someFunction(param1, function() { console.log("inside"); }); console.log("after"); 

如果函数asynchronous执行,那么你会看到这样的东西:

 before after inside 

传递给另一个函数的函数作为callback函数并不一定是asynchronous运行的,但情况往往如此。 要知道的唯一方法是阅读文档,或者更好地testing它。