2013-12-08 2 views
0
User.prototype.isUnique = function() { 
    var result; 
    db.user.count({name:'abcdefg'}, function(err, count){ 
     console.log('the count is: ' + count); 
     result = count; 
    }); 
    return result; 
} 

эта функция используется, чтобы узнать, если этот пользователь является уникальным, но обратный результат всегда «не определено», поскольку операция дб асинхронной. Я считаю, что это обычная проблема в nodejs. Как его решить?делает функция mongoskin является асинхронной синхронизации

Я стараюсь использовать обещание (https://npmjs.org/package/promise), но у меня недостаточно знаний, чтобы понять их документацию. Это для очень продвинутого разработчика.

Вы можете помочь мне с примером кода? Все, что мне нужно сделать, это получить count() с помощью mongoskin, а затем вернуть результат в этот метод-член.

Спасибо!

+0

Есть ли функция wait_for() можно использовать ? –

ответ

1

Это не общий вопрос проблема, это как работает узел и что-то, с чем вам придется привыкнуть.

Простейшим решением (также очень распространенным) является предоставление функции обратного вызова из вызывающего кода. Эта функция будет вызываться всякий раз, когда асинхронное действие закончено:

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 пакет)

+0

Спасибо большое! Позвольте мне попробовать обратный подход. –

+0

Вы знаете, как использовать обещание для решения этой проблемы? (https://npmjs.org/package/promise) –

+0

@ NicolasS.Xu Я добавил пример о том, как реализовать обещания. – robertklep

Смежные вопросы