不确定Node.js代码是否是异步的

时间:2014-01-14 16:15:01

标签: javascript json node.js

我正在运行一个简单的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));
  });
});

应用程序运行并且似乎更新正常,但我不确定它是否是异步的。基本上,只需要知道它是否是,如果它不是一些指针,那么。

2 个答案:

答案 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才会异步运行,但通常情况就是如此。确切知道的唯一方法是阅读文档,或者更好的是,测试它。