Như đã đề cập trong một câu trả lời khác, mã này không đồng bộ, bạn không thể chỉ trả về giá trị bạn muốn cho chuỗi lệnh gọi lại (các hàm lồng nhau). Bạn cần hiển thị một số giao diện cho phép bạn báo hiệu mã gọi khi bạn có giá trị mong muốn (do đó, gọi lại hoặc gọi lại).
Có một ví dụ gọi lại được cung cấp trong một câu trả lời khác, nhưng có một tùy chọn thay thế chắc chắn đáng để khám phá:lời hứa.
Thay vì một hàm gọi lại mà bạn gọi với kết quả mong muốn, mô-đun trả về một lời hứa có thể nhập vào hai trạng thái, được thực hiện hoặc bị từ chối. Mã gọi đợi lời hứa nhập vào một trong hai trạng thái này, hàm thích hợp sẽ được gọi khi nó thực hiện. Mô-đun kích hoạt thay đổi trạng thái bằng cách resolve
ing hoặc reject
ing. Dù sao, đây là một ví dụ sử dụng các lời hứa:
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);
});
Giờ đây, các phiên bản cập nhật hơn của trình điều khiển node.js mongodb có hỗ trợ gốc cho các hứa hẹn, bạn không phải thực hiện bất kỳ công việc nào để kết hợp các lệnh gọi lại trong các lời hứa như ở trên. Đây là một ví dụ tốt hơn nhiều nếu bạn đang sử dụng trình điều khiển cập nhật:
// 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);
});
Hứa hẹn cung cấp một phương pháp tuyệt vời cho luồng điều khiển không đồng bộ, tôi thực sự khuyên bạn nên dành một chút thời gian để tự làm quen với chúng.