У меня есть сервер, написанный на Java, на котором запущен Rhino для js, и я решил переписать этот сервер на nodejs ... И мне нужно получать данные из БД синхронно, например:
function executeRowsetParam(sql, p){
return DB.raw(sql,p)// returns object
}
так что я могу использовать это как:
var userName = executeRowsetParam('SELECT user_name FROM users where user_id = ?', ["123"]);
if (userName.getRow(0).getValue("user_name ") == "admin"){
//do sth
}
это просто простой пример, иногда мне нужно выбрать данные из базы данных, которые я должен использовать, например, в 1000 строк кода, поэтому код вроде:
executeRowsetParam('SELECT user_name FROM users where user_id = ?', ["123"]).then((r)=>{
if (r.getRow(0).getValue("user_name ") == "admin"){
//do sth
}
})
не сработает так хорошо ... У меня тоже есть такой код:
IfExists(SQL,p){
if (DB.raw("selecect top 1 1 from" + sql,p) == 1){
return true
}else{return false}
и переписав его на:
DB.raw("selecect top 1 1 from" + sql,p).then((r)=>{
if (r == 1){//do sth}else{//do else}
})
не сработает для меня так что есть какой-то пакет npm, который я могу использовать для выбора из db synchronuch, который сделает мой день.
такой код будет в порядке?
var Start = async () => {
var Server = require("./core/server/Server");
console.info('hi!');
console.dir("there is nothing to look at at the momment");
var db = require("./core/db/DB");
global.DB = new db()
function foo() {
return DB.executeSQL("asdasd", [123, 123])
}
console.dir(await foo());
console.dir('asd');
global.DEBUG = true;
global.NEW_GUID = require('uuid/v4');
var server = new Server()
server.start();
}
Start();
Достаточно ли этого, чтобы позволить мне использовать await в каждом отдельном экземпляре внутри сервера, или я должен сделать каждую функцию асинхронной, если бы я использовал await?
добавлен пример с async / await
Нет - вы должны сделать свои функции поиска в БД асинхронными (чтобы им нужно было возвращать Promise <Result>), а затем вызывающий код может просто позволить result = await lookupFunction (...). Если вы новичок в async / await, есть множество руководств, если вы его погуглите.
хорошо, я посмотрю на них спасибо :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нашел и протестировал деасинхронизация, отлично работает!
var deasync = require('deasync');
module.exports = function DB(){
var knex = require('knex')(require("./../../config").DB);
this.executeRowsetParam = (sql, param) => {
let done = false;
knex.raw(sql, param).then((r => {
done = r;
})).catch((e => {
throw "Error in query "+ e
}))
deasync.loopWhile(function () { return !done; });
return done
}
}
Я не совсем понимаю вопрос, но если вы просто ищете способ синхронного взаимодействия с БД, вам следует попробовать await / async.