我正在运行一个简单的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);
});
页面配置:
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');
});
用于在页面请求时发送JSON对象的app.post方法之一。有四个,根,它只是指向/ 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));
});
});
应用程序运行并且似乎更新正常,但我不确定它是否是异步的。基本上,只需要知道它是否是,如果它不是一些指针,那么。
答案 0 :(得分:2)
节点中的经验法则:除非方法名称中出现“sync”一词,否则所有 IO都是异步的。这基本上就是节点。
IO包括必须打开文件的任何时间,其中包括所有连接,包括HTTP连接,SQL连接,RabbitMQ连接等,以及磁盘上的所有文件,包括日志文件等。
通常,要了解异步代码,您应该查找回调的位置。在Javascript中,回调通常以匿名函数的形式给出。 e.g。
connection.query(query, req.body, function(err, rows, fields) {
// ^ anonymous function definition
最后一个参数是回调。一般情况下,我会将回调定义为一个函数,该函数作为参数传递给另一个函数(通常但不总是作为匿名函数)。当执行整行代码时,回调当然不会被调用。当query
的定义称之为调用它时调用它,在这种情况下,它将在接收到对查询的响应后表示,这可能是几秒钟之后,特别是在执行以下代码之后很久,并且一个远离的电话堆栈。
需要回调才能实现异步,因为在调用connection.query
之后,响应尚未进入。因此,无论是错误还是行,都无法对响应做任何事情。这需要在以后发生,即异步。所以你通过一个回调来稍后进行处理。
答案 1 :(得分:2)
使用console.log
来编写代码是一种快速而肮脏的方式来证明某些函数是异步运行的:
console.log("before");
someFunction(param1, function() {
console.log("inside");
});
console.log("after");
如果函数异步执行,那么你会看到如下内容:
before
after
inside
作为回调传递给另一个函数的函数不是必然 true才会异步运行,但通常情况就是如此。确切知道的唯一方法是阅读文档,或者更好的是,测试它。