[英]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.