Проблема с Async/await

Добрый день. Помогите пожалуйста await не работает у меня ошибка, помогите найти.

const sqlite3 = require('sqlite3'); //.verbose;
var dd = new sqlite3.Database("dd.sqlite");
async function test1() {
	dd.run("CREATE TABLE IF NOT EXISTS r(t real(12),yreal(12) )", []);
}
async function test2() {
	var q = 1;
	var w = 4;
	dd.run("INSERT INTO r(t,y) VALUES (?,?)", [q, w]);
}
const test = async () = & gt; {
	await test1();
	test2();
}
test();

Error: SQLITE_ERROR: no such table: r Сначала успевает сработать инсерт а потом креате а Async/await должны были спасти от этого просто не желаю иметь калбек хелл.
Спасибо!!!

Магия async/await блокирование потока выполнения будет работать если:

  1. Это выражение должно возвращать Promise
  2. Этот Promise нужно вернуть из async функции или await его в async функции.

Я посмотрел API dd.run. Этот метод не возвращает Promise. Он принимает опциональный третий аргумент-коллбек. Тебе нужно написать обертку вокруг этого метода (или ряда методов), которая будет возвращать Promise.

Ниже не самый гибкий код, но доносит мою мысль. Не проверял работоспосоность, но структурно все корректно.

async function run(db, expr, params) {
	return new Promise(function (resolve, reject) {
		db.run(expr, params, function (err, res) {
			if (err) {
				reject(err)
				return
			}
			resolve(res)
		})
	})
}

async function test1() {
	return run(dd, “CREATE TABLE IF NOT EXISTS r(t real(12), yreal(12))”, [])
}

async function test1() {
	await run(dd, “CREATE TABLE IF NOT EXISTS r(t real(12), yreal(12))”, [])
}

Простите но не сработало, вот что я написал у себя:

const sqlite3 = require('sqlite3');//.verbose;
var dd = new sqlite3.Database("dd.sqlite");
async function run(db, expr, params) {
	return new Promise(function (resolve, reject) {
		db.run(expr, params, function (err, res) {
			if (err) {
				reject(err)
				return
			}
			resolve(res)
		})
	})
}
async function test1() {
	await run(dd, "CREATE TABLE IF NOT EXISTS r(t real(12), real(12))", [])
}
async function test2() {
  var q = 1;
	var w = 4;
	await run(dd, "INSERT INTO r(t,y) VALUES (?,?)", [q, w]);
}
test1();
test2();

Та же ошибка.
Спасибо за ваше время которое вы потратили на помощь мне.

В конце функции запускаются не дожидаясь выполнения асинхронных операций предыдущей. Нужно await test1() чтобы дождаться завершения ее выполнения

Ещё вариант - использовать promise, возвращаемый из test1: ,test1().then(test2)

test1().then(test2());
Спасибо но не сработало буду искать решения дальше.
P.S.

test1().then(test2)
скобки после тест2 забыли :).

Все правильно

Это неверно. Нужно test2 передавать как аргумент в then. Тогда then возьмет функцию test2 и вызовет после резолва промиса из test1

Попробуй еще раз. У меня выпадает ошибка, но уже не из-за race-condition из-за отстутсвующей таблицы, а из-за синтаксиса sql.

test1().then(test2)

Error: SQLITE_ERROR: no such table: r

Emitted ‘error’ event at:
вот ошибка
а вот мой код

const sqlite3 = require('sqlite3');//.verbose;
var dd = new sqlite3.Database("dd.sqlite");

async function run(db, expr, params) {
	return new Promise(function (resolve, reject) {
		db.run(expr, params, function (err, res) {
			if (err) {
				reject(err)
				return
			}
			resolve(res)
		})
	})
}

/*async function test1() {
	return run(dd, "CREATE TABLE IF NOT EXISTS r(t real(12), real(12))", [])
}*/

async function test1() {
  //await 
  dd.run("CREATE TABLE IF NOT EXISTS r(t real(12), y real(12))", []);
}
async function test2() {
  var q = 1;
	var w = 4;
  //await run(dd, "INSERT INTO r(t,y) VALUES (?,?)", [q, w]);
  //await test1();
  dd.run("INSERT INTO r(t,y) VALUES (?,?)", [q, w]);
}
//test1();
test1().then(test2);

Этот код с той же ошибкой для решения которой мы ввели функцию run: async функция должна возвращать такой Promise, который резолвится по окончанию выполнения асинхронной операции. В этом комменте выше я расписывал суть.

Вот код который дожидается завершения выполнения асинхронных операций и выполняет test1 и test2 последовательно. Выкидывает, правда SQL ошибку, но ее я править не буду.

const sqlite3 = require('sqlite3');//.verbose;
var dd = new sqlite3.Database("dd.sqlite");
async function run(db, expr, params) {
	return new Promise(function (resolve, reject) {
		db.run(expr, params, function (err, res) {
			if (err) {
				reject(err)
				return
			}
			resolve(res)
		})
	})
}
async function test1() {
	await run(dd, "CREATE TABLE IF NOT EXISTS r(t real(12), real(12))", [])
}
async function test2() {
  var q = 1;
  var w = 4;
  await run(dd, "INSERT INTO r(t,y) VALUES (1,2)", [q, w]);
}
test1().then(test2)

Спасибо большое вам за помощь! Ошибку SQLite буду исправлять! До свидания!

const sqlite3 = require(‘sqlite3’);
var dd = new sqlite3.Database(“dd.sqlite”);

async function run(db, expr, params) {
return new Promise(function (resolve, reject) {
db.run(expr, params, function (err, res) {
if (err) {
reject(err)
return
}
resolve(res)
})
})
}

async function test1() {
await run(dd, “CREATE TABLE IF NOT EXISTS r(t real(12), y real(12))”, [])
}

async function test2() {
var q = 1;
var w = 4;
await run(dd, “INSERT INTO r(t,y) VALUES (?,?)”, [q, w]);
}

test1();

Вот готовый код без ошибок

Не вижу в коде вызова test2. Ожидаю что должен быть