2015-12-05 104 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"); 

为什么要先打印END?

+2

请每个帖子只问一个问题。 – Bergi

+0

并且毫无疑问,JavaScript与Java无关,即使它们具有相似的名称。 –

+2

“更为正式的语言的Java后端”。我不知道这是什么意思。 – Ben

回答

1

你正在做的大部分工作都涉及使用回调。

您正在将一个函数作为参数传递给另一个函数。其他函数然后调用它。它可能不会(并且在这些情况下不会)将其称为立即

mongoClient.connect(dbUrl, callback); 

这本质上,其实还有另一个进程开始连接到数据库。当该进程报告连接时,将调用回调函数。

与此同时,程序的其余部分(console.log("END");)继续执行。

习惯于使回调函数(而不是返回值)负责处理对这些异步操作的响应。

+0

我猜基于同样的原因,con.close()不能在console.log(“END”)后调用。所以它必须在回调函数中调用。因此这里的关键是异步编程。 – kakoli