2015-12-05 101 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