我刚开始使用promises和Bluebird。在调试时我可以看到我的函数执行了两次:
首先我收到此错误:TypeError: Uncaught error: Cannot read property 'then' of undefined
然后我看到该函数再次执行,.then()
成功执行。我也在控制台中打印了正确的信息。
为什么会这样?我实现promises的全部原因是因为我想等待执行then()
- 操作,因为我的数据必须先被检索。但是代码仍然过早地跳转到.then()动作。
为什么会发生这种情况,我该如何预防?
这是我的代码:
exports.findUser = function(userId){
var ObjectID = require('mongodb').ObjectID;
var u_id = new ObjectID(userId);
db.collection('users')
.findOne({'_id': u_id})
.then(function(docs) { //executed twice, first time error, second time success
console.log(docs); //prints correct info once executed
return docs;
})
.catch(function(err) {
console.log(err);
});
};
答案 0 :(得分:1)
使用本机npm模块时,您应该在此处使用回调,例如documentation。所以对于你的例子,这意味着:
exports.findUser = function(userId){
var ObjectID = require('mongodb').ObjectID;
var u_id = new ObjectID(userId);
db.collection('users')
.findOne({'_id': u_id}, function(err, docs){
console.log(docs); //prints correct info once executed
return docs;
});
};
如果你想使用承诺,你应该考虑使用像mongoose这样的东西。