使用promises将异步函数的结果作为变量返回'

时间:2016-01-21 09:04:08

标签: javascript node.js mongodb asynchronous express

我在NodeJS中遇到异步执行问题。特别是,我有很多用例,我希望在我的代码中稍后使用异步请求的结果,并且不希望将整个事物包含在另一个缩进级别中,例如async.parallel

我知道解决方案是使用promises,但我正在努力使实现正确,我尝试过的资源并没有帮助。

我目前的问题是: 我需要在插入时立即获取MongoDB文档的_id。我已经从使用MongoJS切换到使用官方的MongoDB驱动程序,因为我知道MongoJS不支持promises。任何人都可以提供一个如何使用promises返回此值的基本示例吗?

再次感谢。

2 个答案:

答案 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
$