这不是一个普通的问题,它只是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
如果一切正常。
在上面的代码中,我将在调用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
包安装)
是否有任何wait_for()函数,我可以使用? –