Это не общий вопрос проблема, это как работает узел и что-то, с чем вам придется привыкнуть.
Простейшим решением (также очень распространенным) является предоставление функции обратного вызова из вызывающего кода. Эта функция будет вызываться всякий раз, когда асинхронное действие закончено:
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, которые делают асинхронный код похожим на, так же как и синхронно, но для его использования требуется компилировать ваш код (хотя это также можно сделать во время выполнения), прежде чем вы сможете его использовать.
EDIT: если вы хотите использовать обещания, вы можете использовать это:
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() можно использовать ? –