2016-08-14 3 views
-2
conn = mysql.createConnection(options); 
    conn.connect(); 
    var sql = 'select * from member'; 

    for(var i=0; i<3; i++){ 
     (function(){ 
     console.log(i); 
     conn.query(sql, function(err,result){ 
      console.log('q'); 
     }) 
     })(i) 
    } 
     for (var i=0; i<2; i++){ 
     console.log(i) 
     } 

Я использую npm-mysql. Я ожидал, что консоль отобразит «012qqq01», но на самом деле я получил «01201qqq». Я смущен. Почему «conn.querry» исполняется последним? Заранее спасибо.nodejs выполнить заказ, используя mysql

+1

Не является ли обратный вызов (или функция), который вы передаете как второй аргумент для 'con.query', выполняемый асинхронно? Если он выполнен таким образом, это может объяснить ваш результат ... – nbro

+0

Дубликат - http://stackoverflow.com/questions/38945606/node-js-does-not-wait-for-the-mysql-server-sends -the-answer-and-continue-to-wo –

+0

Если вы не знакомы с асинхронным кодом, вам придется получить дескриптор этого файла, прежде чем писать код Node.js. Это * чрезвычайно * зависит от этого принципа, поскольку он является философией вождения. – tadman

ответ

0

У вас есть функция, которая регистрирует i, а затем отправляет запросы в базу данных в цикле и журналы через другой цикл. Эта функция работает.

Либо пока это происходит, либо когда-то после его завершения, результаты запросов будут отправлены обратно из базы данных.

Когда JS-двигатель не занят запуском первой функции, он начнет проверку, чтобы узнать, прибыло ли событие, указывающее ответ от базы данных. Затем он вызовет функцию обратного вызова и журнал «q».

+0

Спасибо за мудрый ответ на глупый вопрос. Интересно, если JS-движок занят, будет ли JS-движок вызывать обратный вызов? Или это будет просто занятая работа, а не вызов обратного вызова, даже если ответ пришел? – user6607973

+0

Он будет продолжать делать то, что он делает. Это не остановится посреди чего-то, чтобы ответить на событие. – Quentin

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