2015-11-08 2 views
-1

Так еще довольно новый для nodejs образа мышления и есть вопрос о том, как лучше это сделатьsequencial запросов с использованием nodejs и SqlLite

вот фрагмент кода, который работает там, где я получаю два идентификаторы из SqliteDB и затем отправьте их клиенту.

client.on('join', function(data) { 
    var last_new_id=0; 
    var last_old_id=0; 
    var db = new sqlite3.Database(file); 
    db.serialize(function() { 
     db.each("SELECT last_new_id, last_old_id FROM image_status ", function(err, row) { 
      if (err){ 
       console.log("**** ERROR IN SELECT ****"); 
       console.log(err); 
      }else{ 
       last_new_id = row.last_new_id; 
       last_old_id = row.last_old_id; 
      } 
     }, function() { 
      client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id}); 
     }); 
    }); 
}); 
db.close(); 

Если таблица image_status пуст он идет прямо на client.emit

Что я хочу сделать, это если last_new_id или last_old_id равен нулю, я хочу сделать еще один запрос

Я думал, что попробую что-нибудь вроде

}, function() { 
    if (last_new_id == 0) { 
     //query the db with 
     //SELECT image_id FROM image ORDER BY image_id DESC LIMIT 1 
     last_new_id = getLastID();  
    } 
    client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id}); 
}); 

но что происходит, это t он client.emit вызывается до возвращения getLastID.

Я не уверен, как вызвать getLastID() синхронно или есть лучший способ сделать это?

Благодаря

ответ

1

Видимо, ваша getLastID функция вызывает асинхронный вызов для запросов к базе данных. Вам нужно изменить функцию обратного вызова на исходный запрос, добавив дополнительную обработку обратного вызова для функции getLastID.

Например, как это:

}, function() { 
    var emitIDs = function() { 
     client.emit('joined', {last_new_id: last_new_id, last_old_id: last_old_id}); 
    } 
    if (last_new_id == 0) { 
     //query the db with 
     //SELECT image_id FROM image ORDER BY image_id DESC LIMIT 1 
     getLastID(function(image_id) { 
      last_new_id = image_id 
      emitIDs() 
     }) 
     // getLastID must call the given callback 
     // and use the determined image_id as first parameter 
    } 
    else { 
     // alternative execution path if image_id is not requested 
     emitIDs() 
    } 
}); 

Для асинхронного программирования вы всегда должны явно указать все пути выполнения, например, с использованием if и else, как показано выше. Будьте настороже, если вы видите один if без надлежащего else, в частности, за которым последуют дополнительные вызовы функций, как в вашем примере. Вещи могут не выполняться в желаемом порядке.

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