2014-01-14 3 views
1

Я запускаю простое приложение node.js, которое отправляет объект JSON после http post. Приложение использует модули 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'); 
}); 

И один из методов 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)); 
    }); 
}); 

Приложение работает и, кажется, прекрасно обновляет, но я не уверен, является ли оно асинхронным или нет. В принципе, просто нужно знать, если это так, и если это не некоторые указатели, чтобы это сделать.

+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 

Это не обязательно true, что функция, переданная другой функции в качестве обратного вызова, будет выполняться асинхронно, но это часто бывает. Единственный способ узнать наверняка - прочитать документацию или, еще лучше, проверить ее.

+0

Nice. Спасибо за совет. –

+0

* или еще лучше, источник.К сожалению, обещания обратного вызова иногда могут выполняться синхронно, иногда асинхронно, в зависимости от того, завершено ли обещание. Есть дискуссия о том, всегда ли это поведение. Таким образом, тестирование не будет тщательным. – djechlin

Смежные вопросы