问题概述
最近在用Electron+Vue做一个小软件,集成了SQLite,数据库层用的knex,将常用的方法写在了DbUtils.js里
需求:在Vue组件里调用DbUtils的方法,获取数据库查询出来的数据
问题:knex里好像用的是promise,等Vue组件里的非异步的代码执行完了,才查出来数据,那么在组件里是获取不到数据的
代码分析
项目gitee地址:TimeRecorder
在DbUtils.js有一个查询数据的方法
//返回labelTable的所有值
function returnLabelTableData_test() {
var data
knex.select("*").from('labelTable').then((rows) => {
data = rows
rows.forEach(row => {
console.log(`${row['ID']} ${row['recordDate']} ${row['beginTime']} ${row['endTime']} ${row['firstLabel']} ${row['secondLabel']} ${row['timeNote']}`);
});
})
.catch((err) => { console.log(err); throw err })
.finally(() => {
knex.destroy();
});
return data //返回labelData里的所有数据
}
在TRRecord.vue里引入DbUtils,调用方法:
loadLabels(){
var data = DbUtils.getLabelTableData()
console.log('loadLabels',data) //输出是undefined
},
尝试的解决措施
用promise的async和await,testDbutl.js:
async function getLabelTableData(){
var data = await returnLabelTableData();
console.log(data);
}
//返回labelTable的所有值
function returnLabelTableData() {
return knex.select("*").from('labelTable')
}
这样子能正常输出data(数据库里的内容),但是好像会卡死…… 控制台一直不动,只能ctrl+C
本人对于JS才刚入门,看了不少promise的文章,感觉还是有点难懂,对于async和await好像是generator的语法糖? 网上也大致搜索了下,对于knex的文档资料有点少,请问各位有无遇到过这样的需求?
参考资料
Promise 对象 - 阮一峰 ECMAScript 6入门
async await用法,结合promise,将js异步变成同步_yuanyi正的博客-CSDN博客
Knex Query Builder | Knex.js官网文档
StackOverflow:
node.js - Synchronous MySQL query with NodeJS and KnexJS - Stack Overflow
knex.js - How to use Knexjs synchronously on Apollo GraphQL Server - Stack Overflow
<template>
没写错,不需要关心数据是什么时候拿到的,只要拿到后更新数据,视图就会自动更新。你不用担心 Vue 里的执行顺序。