这不是一个常见的问题,它只是 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
...
});
null
在 Node 中,如果发生错误或一切正常,回调函数至少接受一个包含错误对象的参数也是很常见的。
在上面的代码中,我传递了在调用db.user.count
回调函数期间可能发生的任何错误。由调用代码来处理任何错误。
处理异步代码有几种选择。一种是使用承诺,就像你提到的那样。还有一些解决方案,比如streamline,可以让异步代码看起来像是同步的,但它要求你在使用它之前“编译”你的代码(尽管这也可以在运行时完成)。
编辑:如果你想使用承诺,你可以使用这个:
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
安装包)