Функция асинхронного вызова базы данных не работает
function getNextID(number){
var maxKey = 0;
number = typeof number !== 'undefined' ? number : 1;
db.from('contributions').select('id').list().done(function(records) {
records.forEach(function(item){
if (maxKey < item){
maxKey = item;
}
});
return(maxKey);
});
}
Я использую ydn-db
Это класс для работы с локальным хранилищем - он работает асинхронно, а не AJAX!
То, что я пытаюсь сделать, это получить следующий идентификатор на столе (но этот бит на самом деле не имеет значения).
Проблема у меня либо:
а) Я идиот и неправильно понимаю свою цель maxKey
б) асинхронные вызовы все портят.
На данный момент функция всегда возвращает "неопределенное" - однако, если я заменю return на console.log(maxKey);
это работает отлично.
Может кто-нибудь сказать мне, как я могу исправить эту функцию, чтобы она могла быть вызвана правильно?
(это примерная функция, поэтому, хотя любая встроенная функция для нахождения следующего ключа была бы оценена, мне действительно нужно знать, как возвращать асинхронные элементы из функции!)
Я надеюсь, что это ясно - любые вопросы - огонь!
2 ответа
function getNextID(number,callback){
var maxKey = 0;
number = typeof number !== 'undefined' ? number : 1;
db.from('contributions').select('id').list().done(function(records) {
records.forEach(function(item){
if (maxKey < item){
maxKey = item;
}
});
callback(maxKey);
});
}
тогда в вашем коде
getNextID(number,function(maxKey){
// continue the code here.
});
поскольку ваш код асинхронный, вы не можете вернуть что-либо из getNextID, кроме обещания или использовать продолжение (обратный вызов).
Поскольку первичный ключ отсортирован, вы можете получить максимальный ключ, просто взяв первый:
function getNextID(number,callback){
var key_range = number ? ydn.db.KeyRange.lowerBound(number, true) : null;
var reverse = true; // sort by descending order
var iter = new ydn.db.KeyIterator('contributions', key_range, reverse);
db.get(iter).done(function(maxKey) {
callback(maxKey);
});
}