User.prototype.isUnique = function () {
var result;
db.user.count({name:'abcdefg'}, function(err, count){
console.log('the count is: ' + count);
result = count;
});
return result;
}
此函数用于查明此用户是否唯一,但返回结果始终为“未定义”,因为db操作是异步的。我相信这是nodejs中的常见问题。 我该如何解决?
我尝试使用promise(https://npmjs.org/package/promise),但我没有足够的知识来理解他们的文档。这是非常先进的开发人员。
您能帮我一些示例代码吗?我需要做的就是使用mongoskin获取count(),然后在此成员方法中返回结果。
谢谢!
答案 0 :(得分:1)
这不是一个常见的问题,它只是Node的工作原理以及您必须习惯处理的事情。
最简单的解决方案(也是一个非常常见的解决方案)是从调用代码提供回调函数。异步操作完成后将调用该函数:
User.prototype.isUnique = function(callback) {
db.user.count({name:'abcdefg'}, function(err, count){
console.log('the count is: ' + count);
callback(err, count);
});
}
// in your calling code:
user.isUnique(function(err, count) {
if (err) ...; // TODO: handle error
...
});
在Node中,如果发生错误,回调函数接受至少一个包含错误对象的参数,或者如果一切正常,则null
。
在上面的代码中,我将调用db.user.count
期间可能发生的任何错误传递给回调函数。由调用代码来处理任何错误。
处理异步代码有几种选择。一个是使用承诺,就像你提到的那样。还有像streamline这样的解决方案使异步代码看起来就像它是同步的一样,但是它要求你“编译”你的代码(虽然这也可以在运行时完成)然后你可以用它。
编辑:如果你想使用promises,可以使用:
var Promise = require('promise');
User.prototype.isUnique = function() {
return Promise(function(resolve, reject) {
db.user.count({name:'abcdefg'}, function(err, count){
if (err) {
console.log('an error occurred:', err);
reject(err);
} else {
console.log('the count is:', count);
resolve(count);
}
});
});
};
// in your calling code:
user.isUnique().then(function(count) {
...
}, function(err) {
...
});
(这需要安装promise
包)