我在NodeJS中遇到异步执行问题。特别是,我有很多用例,我希望在我的代码中稍后使用异步请求的结果,并且不希望将整个事物包含在另一个缩进级别中,例如async.parallel
我知道解决方案是使用promises,但我正在努力使实现正确,我尝试过的资源并没有帮助。
我目前的问题是:
我需要在插入时立即获取MongoDB文档的_id
。我已经从使用MongoJS切换到使用官方的MongoDB驱动程序,因为我知道MongoJS不支持promises。任何人都可以提供一个如何使用promises返回此值的基本示例吗?
再次感谢。
答案 0 :(得分:1)
您可以使用Promise.then()的传统方法,或者如果您可以使用ES6,请尝试生成器函数(生成器直接包含在Node中,不需要运行时标志)。这样,你可以简单地编写这段代码:
//You can use yield only in generator functions
function*() {
const newDocument = new Document({firstArg, SecondArg});
const savedDocument = yield newDocument.save();
//savedDocument contains the response from MongoDB
}
您可以阅读有关函数* here
的更多信息答案 1 :(得分:1)
使用node.js驱动程序,使用集合的 insert()
方法返回一个承诺。以下示例演示了这一点:
var Db = require('mongodb').Db,
MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server;
var db = new Db('test', new Server('localhost', 27017));
// Fetch a collection to insert document into
db.open(function(err, db) {
var collection = db.collection("post");
// Create a function to return a promise
function getPostPromise(post){
return collection.insert(post);
}
// Create post to insert
var post = { "title": "This is a test" },
promise = getPostPromise(post); // Get the promise by calling the function
// Use the promise to log the _id
promise.then(function(posts){
console.log("Post added with _id " + posts[0]._id);
}).error(function(error){
console.log(error);
}).finally(function() {
db.close();
});
});
您还可以使用Mongoose的 save()
方法,因为它返回 Promise
。证明这一点的基本例子如下:
// test.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
// Establish a connection
mongoose.connect('mongodb://localhost/test', function(err) {
if (err) { console.log(err) }
});
var postSchema = new Schema({
"title": String
});
mongoose.model('Post', postSchema);
var Post = mongoose.model('Post');
function getPostPromise(postTitle){
var p = new Post();
p.title = postTitle;
return p.save();
}
var promise = getPostPromise("This is a test");
promise.then(function(post){
console.log("Post added with _id " + post._id);
}).error(function(error){
console.log(error);
});
运行应用
$ node test.js
Post added with _id 5696db8a049c1bb2ecaaa10f
$