Seperti disebutkan dalam jawaban lain, kode ini tidak sinkron, Anda tidak bisa begitu saja mengembalikan nilai yang Anda inginkan di rantai panggilan balik (fungsi bersarang). Anda perlu mengekspos beberapa antarmuka yang memungkinkan Anda memberi sinyal kode panggilan setelah Anda memiliki nilai yang diinginkan (karenanya, memanggil mereka kembali, atau panggilan balik).
Ada contoh panggilan balik yang disediakan dalam jawaban lain, tetapi ada opsi alternatif yang pasti perlu ditelusuri:janji.
Alih-alih fungsi panggilan balik yang Anda panggil dengan hasil yang diinginkan, modul mengembalikan janji yang dapat memasukkan dua status, terpenuhi atau ditolak. Kode panggilan menunggu janji untuk memasukkan salah satu dari dua status ini, fungsi yang sesuai dipanggil ketika itu terjadi. Modul memicu perubahan status dengan resolve
ing atau reject
ing. Bagaimanapun, ini adalah contoh menggunakan janji:
Db1.js:
// db1.js
var MongoClient = require('mongodb').MongoClient;
/*
node.js has native support for promises in recent versions.
If you are using an older version there are several libraries available:
bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.
*/
var Promise = require('rsvp').Promise;
module.exports = {
FindinCol1: function() {
return new Promise(function(resolve, reject) {
MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {
if (err) {
reject(err);
} else {
resolve(db);
}
}
}).then(function(db) {
return new Promise(function(resolve, reject) {
var collection = db.collection('col1');
collection.find().toArray(function(err, items) {
if (err) {
reject(err);
} else {
console.log(items);
resolve(items);
}
});
});
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
Sekarang, versi driver mongodb node.js yang lebih mutakhir memiliki dukungan asli untuk promise, Anda tidak perlu melakukan pekerjaan apa pun untuk membungkus panggilan balik dalam janji seperti di atas. Ini adalah contoh yang jauh lebih baik jika Anda menggunakan driver terbaru:
// db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
FindinCol1: function() {
return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {
var collection = db.collection('col1');
return collection.find().toArray();
}).then(function(items) {
console.log(items);
return items;
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
Promise menyediakan metode yang sangat baik untuk aliran kontrol asinkron. Saya sangat menyarankan Anda meluangkan waktu untuk membiasakan diri dengan mereka.