簡體   English   中英

不確定Node.js代碼是否異步

[英]Not sure if Node.js code is asynchronous

我正在運行一個簡單的node.js應用程序,該應用程序在http發布時發送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');
});

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

該應用程序可以運行,並且似乎可以正常更新,但是我不確定它是否異步。 基本上,只需要知道它是否是,是否不是要這樣做的一些指針即可。

節點中的經驗法則:除非方法名稱中出現單詞“ sync”,否則所有 IO都是異步的。 這本質上就是節點。

IO包括必須打開文件的任何時間,包括所有連接,包括HTTP連接,SQL連接,RabbitMQ連接等,以及磁盤上的所有文件,包括日志文件等。

通常,要了解異步代碼,您應該尋找回調的位置。 在Javascript中,回調函數通常以匿名函數的形式給出。 例如

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

最后一個參數是回調。 通常,我將回調定義為一個函數,該函數作為參數傳遞給另一個函數(通常但不總是作為匿名函數)。當執行全部代碼行時,當然不會調用該回調。 query定義說要調用它時調用它,在這種情況下,這意味着在收到查詢響應之后,可能是幾秒鍾之后,尤其是在執行以下代碼后很長時間,並且在調用堆棧中遠。

需要回調來實現異步,因為在connection.query調用之后,響應尚未進入。 因此,無論是錯誤還是行,都無法對響應做任何事情。 這需要稍后進行,即異步進行。 因此,您傳遞回調以在以后的某個時間進行該處理。

console.log標記代碼是一種快速而骯臟的方法,用於演示某些函數正在異步運行:

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

如果該函數異步執行,那么您將看到以下內容:

before
after
inside

一個函數作為回調傳遞給另一個函數並不一定要異步運行,但通常是這樣。 唯一可以確定的方法是閱讀文檔,或者更好地進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM