Задать вопрос
ettaluni
@ettaluni
ERROR MEME

NodeJS async\await в классах ES6, не работает?

Доброго дня! Пытаюсь заставить работать свой код как я его написал.
Есть цепочка вызовов:
module1.init()->module1.getProjectStatus()->module2.isNew(); Естественно все через await\async
Чтобы код отработал хоть немного так как написал я вынужден вставлять async\await функции обертки.
Проблема в том что он пропускает функцию isNew() например, в итоге переменная остается не про инициализированной, выполняет ее в конце, а мне нужно в начале.
Раньше писал на Prototype -> function и вообще проблем не было с асинхронностью, ставил await и будет ждать. Говонокод но работал. А тут решил идти в ногу со временем, на классах все реализовал, конструкторах код сладкий но работает как хочет.
Может эти сахарные конструкции ввиде constructor - class межают реализации await?
Вот пример кода:
let pState = false;
		await (async () => {
			pState = await this.getProjectStatus();
			console.log('pState is getProjectStatus' + pState);
			return;
		})();

		console.log('pState is ' + pState);

		if (pState == 'new')
			await this.prepare();

Пример кода с классом, не знаю зачем.
class SuperClass {
	constructor (settings) {
		if (!this.isCorrectSettings())
			console.log('Settings is incorect');

		let defaultSettings = {
			MAX_UPDATE_TIME: 5, //hours
			PRG_WORK_DIR: __dirname,
			PROJECT_DIR: __dirname,
		};	
		
		this.settings = Object.assign(defaultSettings, settings);


		//T-200
	}
		
	async init() {
		await this.initPaths();
		await this.initModules();
		await this.initVars();

Проблемный код, функция для работы базыданных выполняеться в самом конце программы а должна выполняться первой.
isNew() {
	let res = false;
	let deDB = this.deDB;
	let fd =  deDB.run("SELECT id, dt FROM meta", function(err) {
		if (err)
			res = true;
			console.trace('Step1');
		});
	console.trace('Step2 ' + res);
	return res;
}

Я поставил метки в коде, вот собственно вывод. Step1 в конце, а должне быть в начале. Step6 вообще нет.
Step2 false
Step3 false
Step4 contunue
Step5 contunue
End of test - O213k4
getArrayRows - Error ads
getArrayRows - Error matrix
getArrayRows - Error meta
Step1
  • Вопрос задан
  • 187 просмотров
Подписаться 1 Средний 19 комментариев
Решения вопроса 1
@DimaIs
Если вы хотите вызывать ваши функции после сработки коллбека запроса к БД, то нужно либо:
1) Указать эти функции уже внутри коллбека (он сам вызовет эти функции)
2) Промисифировать функцию вызова бд, чтобы можно было применять к ней await (или then, кому как удобно):
const runBdQuery = query =>  new Promise((resolve, reject) => {
        deDB.run(query, function(err) {
            if (err)
                   reject(err);
               res = true;
               resolve(res) // тут все что угодно
     	    console.log('Step1');
  	});
    })

Далее можно делать так:
const makeQuery = async () => {
    const query = "SELECT id, dt FROM meta";
    await runBdQuery(query);
    await step1();
   ----------
     await step6();
}
makeQuery();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы