Все примеры использования клиентского пакета/утомительного драйвера mssql относятся к асинхронным/обратным вызовам/обещаниям, но я только разрабатываю микросервис, который будет использоваться ограниченно, и мое понимание асинхронных функций все еще немного нечеткое. Вот что у меня есть для попытки использовать async/await :
Класс формирования отчета:
const mssql = require('mssql');
const events = require('events');
class reporter {
constructor(searcher, logger) {
// Pass in search type and value or log the error of none defined
this.lg = logger
if (searcher.type && searcher.content) {
this.lg.lg("reporter created", 3)
this.srchType = searcher.type;
this.srchContent = searcher.content;
} else {
this.lg.lg("!MISSING SEARCH PARAMETERS", 0);
this.err = "!MISSING SEARCH PARAMETERS";
}
}
proc() {
//DB Connect async
async () => {
try {
await mssql.connect('mssql://username:password@localhost/database')
this.result = await mssql.query`select * from mytable where id = ${this.searcher}`
} catch (err) {
// ... error checks
}
}
return this.result;
}
}
Затем позвонил:
//Pass to reporter for resolution
var report1 = new reporter(searcher, logs);
report1.proc();
Я уверен, что это, вероятно, довольно плохой способ добиться этого, поэтому я также открыт для любого вклада в хорошие способы достижения конечной цели, но я все же хотел бы знать, возможно ли это выполнить синхронно.
Вы не можете сделать это синхронно. Выяснение этого асинхронного материала определенно стоит вашего времени и усилий.
async/await/promises позволяют более-менее фейково делать это синхронно
const report1 = new reporter(searcher, logs);
report1.proc()
.then ( result => {
/* in this function, "result" is what your async function returned */
/* do res.send() here if you're in express */
} )
.catch ( error => {
/* your lookup failed */
/* inform the client of your web service about the failure
* in an appropriate way. */
} )
И разверните асинхронную функцию в вашей функции proc, например:
async proc() {
try {
await mssql.connect('mssql://username:password@localhost/database')
this.result = await mssql.query`select * from mytable where id = ${this.searcher}`
} catch (err) {
// ... error checks
}
return this.result;
}
await
и .then
аналогичны.
О, фейспалм, извините, это then()
не next()
.
Своего рода обновленный ответ, который продолжает ответ О. Джонса. Текущая версия Node.js (v15+) поддерживает ожидание верхнего уровня, что означает, что вы могу запускаете все это последовательно.
import mssql from 'mssql';
await mssql.connect('mssql://username:password@localhost/database')
const result = await mssql.query`select * from mytable where id = ${this.searcher}`
Но этого все равно следует избегать, так как вы хотите отлавливать ошибки, а не допускать их сбоя.
В текущих версиях Node.js, если ожидание/обещание отклоняется и не перехвачено с помощью .catch()
, то неперехваченное обещание завершит ваше приложение с ошибкой.
Вам это может не понравиться, но JavaScript как язык предназначен для асинхронных задач. Вы, вероятно, должны использовать это. Используйте
await
для имитации синхронного поведения; developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…