2014-01-14 93 views
1

我正在運行一個簡單的node.js應用程序,它在http post上發送JSON對象。該應用程序使用node-mysql和express模塊​​。不知道是否Node.js代碼是異步的

這是代碼。

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

應用程序運行並似乎更新正常,但我不知道它是否異步或不。基本上,只需要知道它是否是,並且如果它不是一些指示器。

+1

是的,你的代碼是異步的:) – thefourtheye

回答

2

節點中的經驗法則:除非方法名稱中出現「sync」字樣,否則全部爲 IO異步。這實質上是節點的要點。

IO包括任何時間一個文件必須被打開,其中包括所有的連接,包括HTTP連接,SQL連接,RabbitMQ的連接等,並在磁盤上的所有文件,包括日誌文件等

通常至理解異步代碼,你應該查找回調的位置。在Javascript中,回調通常以匿名函數的形式提供。例如

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

最後一個參數是回調。一般來說,我會將回調函數定義爲一個函數,該函數作爲參數傳遞給另一個函數(通常,但並非總是,作爲匿名函數)。當整行代碼執行時,回調當然不會被調用。它在query的定義說調用它的時候被調用,在這種情況下,這意味着在接收到對查詢的響應之後(可能是幾秒鐘後),特別是在執行以下代碼之後,以及在遠處的調用堆棧中遠。

實現異步需要回調函數,因爲在調用connection.query之後,響應還沒有到來。所以對響應做任何事情都是不可能的,無論是錯誤還是行。這需要稍後發生,即異步。所以你通過回調來稍後處理。

2

console.log尖刻你的代碼是一個快速和骯髒的方式來證明一些功能是異步運行:

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

如果函數異步執行的,那麼你會看到這樣的內容:

before 
after 
inside 

這不是必然確實,作爲回調傳遞給另一個函數的函數將異步運行,但通常是這種情況。唯一確定的方法是閱讀文檔,或者更好地測試它。

+0

不錯。謝謝你的提示。 –

+0

*或更好的來源。不幸的是,承諾回調有時可能會同步運行,有時是異步運行,具體取決於promise是否完成。關於這種行爲是否永遠有好處存在爭議。所以,測試不會徹底。 – djechlin

相關問題