2015-12-05 3 views
0

Исходя из бэкэнда Java, который является более формальным языком с сильными синтаксисами и отсутствием передачи функции, у меня есть некоторые новички запросов при выполнении JavaScript.Как работает java скриптовый движок?

var mongodb = require('mongodb'); 
var mongoClient = mongodb.MongoClient; 
var dbUrl = 'mongodb://localhost:27017/test'; 
var con; 

function callback(err, db) { 
    if (err) console.log('Unable to connect to the mongoDB server. Error:', err); 
    else { 
     console.log('Connection established to', dbUrl); 
     con = db; 
     findEmps(con, function() { 
      console.log("After find"); 
      con.close(); 
     }); 
    } 
} 
mongoClient.connect(dbUrl, callback); 

function findEmps(db, callback) { 
    var cursor = db.collection('emp').find(); 
    //iterate on the result 
    cursor.each(function(err, result) { 
     assert.equal(err, null); 
     if (result != null) { 
      console.dir(result); 
     } else { //end of cursor where result is null 
      console.log("In ELSE"); 
      callback(err, con); 
     } 
    }); 
} 
console.log("END"); 

Почему сначала печатается КОНЕЦ?

+2

Пожалуйста, задайте только один вопрос за сообщение. – Bergi

+0

И не ошибитесь, JavaScript не имеет ничего общего с Java, хотя у них похожие имена. –

+2

«Бэкэнд Java, который является более формальным языком». Я не знаю, что это значит. – Ben

ответ

1

Большая часть того, что вы делаете, включает использование обратных вызовов.

Вы передаете функцию в качестве аргумента другой функции. Затем вызывает другую функцию. Он не может (и в этих случаях нет) называть его немедленно.

mongoClient.connect(dbUrl, callback); 

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

В то же время остальная часть программы (console.log("END");) продолжает выполняться.

Привыкание к выполнению функций обратного вызова (вместо возвращаемых значений), отвечающих за ответы на такие асинхронные операции.

+0

По той же причине, con.close() не может быть вызван после console.log («END»). Поэтому его нужно вызвать в функции обратного вызова. Таким образом, ключ представляет собой асинхронное программирование. – kakoli

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