Добрый день. Помогите пожалуйста 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 блокирование потока выполнения будет работать если:
Это выражение должно возвращать Promise
Этот 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))”, [])
}
Этот код с той же ошибкой для решения которой мы ввели функцию 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)