Я знаю, что следующий код печатает результат моего запроса в командной строке:
query.on("row", function (row, result) {
result.addRow(row);
});
query.on("end", function (result, callback) {
println(JSON.stringify(result))
});
Тем не менее, я хочу использовать значение результата в следующем коде как переменную, а не просто распечатать ее в командной строке.
Обновление. Невозможно использовать значения для следующего запроса, я хочу, чтобы он находился за пределами области запроса:
query.on("row", function (row, result) {
result.addRow(row);
});
query.on("end", function (result, callback) {
println(JSON.stringify(result))
});
//use the result here
Заранее благодарю за ваши ответы.
У вас есть 2 варианта:
Если вы хотите продолжить использование базового драйвера, вам придется использовать обратный вызов результата, а затем вложить их для использования результата в следующем запросе:
connection.query(query1, values1, function(err1, result1) {
// check if(err1) first, then:
connection.query(query2, values2, function(err2, result2) {
// check if(err2) first, then:
connection.query(query3, values3, function(err3, result3) {
// check if(err3) first, then:
cb(result1, result2, result3);
});
});
});
Альтернативный подход заключается в использовании обещаний (pg-prom), когда вы можете связать такие вызовы следующим образом:
db.query(query1, values2)
.then(data => {
return db.query(query2, values2);
})
.then(data => {
return db.query(query3, values3);
})
.catch(error => {});
Хотя правильный подход для пг-обещание в этом случае с помощью метода task
:
db.task(t => {
const result = {};
return t.query(query1, values1)
.then(data => {
result.a = data;
return t.query(query2, values2);
})
.then(data => {
result.b = data;
return t.query(query3, values3);
});
.then(data => {
result.c = data;
return result;
});
})
.than(data => {
// data = {a, b, c}
})
.catch(error => {});
Второй подход автоматически дает вам доступ к современному синтаксису ES6 и ES7 при одновременном выполнении нескольких запросов, как вы можете:
Для ES6:
db.task(function * (t) {
let a = yield t.query(query1, values1);
let b = yield t.query(query2, values2);
let c = yield t.query(query3, values3);
return {a, b, c};
})
.than(data => {
// data = {a, b, c}
})
.catch(error => {});
Для ES7/Babel:
db.task(async t => {
let a = await t.query(query1, values1);
let b = await t.query(query2, values2);
let c = await t.query(query3, values3);
return {a, b, c};
})
.than(data => {
// data = {a, b, c}
})
.catch(error => {});