这是我的代码:
const mariadb = require('mariadb');
var test = async function(){
var ret = "";
await mariadb.createConnection({
host: "localhost",
user: "dave",
connectionLimit: 5,
password: "!@#",
database: "db",
rowsAsArray: false
}).then((data)=>{
ret = "test";
});
return ret;
}
console.log(test());
如何使用await从那以后获得回报?
我知道在很多情况下都提出过类似的问题,但是使用mariadb找不到任何问题。
答案 0 :(得分:0)
我已经看到了一些陷阱,作为初学者,您将在此代码中遇到这些陷阱:
avait
等待结果返回,因为他将得到Promisses
来解决then
异步解决承诺async
的函数总是返回promise 过了一会儿高兴之后,“异步/等待”现在我试图避开他。主要是因为在使用then
之前,我使用异步函数的每个函数也必须是异步的,例如进行小测试:
let test = async function() {
let x = await 11
return 1;
}
console.log(test()) //returns: Promise { <pending> }
那里没有异步,但是添加async / await
会造成混乱。
现在修复了您的代码
const mariadb = require('mariadb');
// use local scope `let` instead global `var`
let test = async function(){
let conn = await mariadb.createConnection({
host: "localhost",
user: "dave",
connectionLimit: 5,
password: "!@#",
database: "db",
rowsAsArray: false
});
return conn.query("SELECT 1 as val") // no sense using `avait` because `test()` returns `promise`
}
test().then(function(rows) { console.log(rows)});
并且没有asnc。 then
可以返回承诺,下一个then
可以解决此问题
mariadb.createConnection(...).then(conn => { // create connection
return conn.query("SELECT 1 as val") // make query
}).then(rows => { //get result
console.log(rows)
}).catch(err => console.error(err)) // get errors
顺便说一句:对查询构建器感兴趣,例如knex.js。它允许编写独立于数据库引擎的代码。
让我们从Node基于事件的事实开始。
让我们以从数据库接收数据为例。在PHP / C ++中,您进行查询,等待并接收结果。并且此行为由await
模拟。 (等待出现在版本8附近)
通常,Node中的代码起作用,以便您执行查询,然后Node创建一个新线程。旧指令执行下一条指令,新指令将得到结果。 (好的,我在撒谎,但是更容易解释)。
因此,您必须处理接收数据的事件。更具体地说,promise
是提供数据。通过await
,.then ()
或callback (hell)
您尝试返回ret
,但是此代码首先生成return ret
,然后进行赋值。
await
“返回”数据,因此您应该使用let var_name = await asyncFunction()
我想,你想要这个:
let getSomeDataFromDB = function(){
return mariadb.createConnection([skip]).then(conn => {
return conn.query("SELECT 1 as val")
})
}
let rows = await getSomeDataFromDB()
在此函数中,您将返回诺言,后者将诺言。通过await
,这个承诺链得以解决。
但是这是代码中的“小”错误。因为您正在连接,并且您不会在任何地方终止连接。因此,最好有一个全局连接对象,或者使用类似这样的东西:
let getSomeDataFromDB = function(){
return new Promise(function(resolve, reject){
mariadb.createConnection([skip]).then(conn => {
conn.query("SELECT 1 as val")
.then(rows=>resolve(rows))
.catch(e=>reject(e))
.then(()=>conn.close())
}).catch(e => reject(e))
})
}
let rows = await getSomeDataFromDB()
在这里您发现另一件重要的事情:resolve
不会中断代码的执行。尽管数据已返回给用户,您仍然可以做一些事情。
与await
let getSomeDataFromDB = async function(){
let conn = await reateConnection([skip])
let rows = await conn.query("SELECT 1 as val")
await conn.close();
return rows;
}
let rows = await getSomeDataFromDB()