server.get('/',(req,res)=>{
var num;
var users;
var hrefs;
db.query(`SELECT COUNT(*) FROM index_table `,(err,data)=>{
num=data[0];
})
db.query(`SELECT username FROM index_table `,(err,data)=>{
users=data[0];
})
db.query(`SELECT href FROM index_table `,(err,data)=>{
hrefs=data[0];
})
var datatotal={
'num':num,
'users':users,
'hrefs':hrefs
}
console.log(datatotal.num);
console.log(datatotal.users)
console.log(datatotal.hrefs)
res.render('index.ejs',{datatotal});
});
当访问主页的时候我想从数据 取3条数据 但是打印出来的时候是undefined 我i知道是异步的原因,我这种代码还可以怎么写呢?
不用callback的情况下
最原始的就是 一层层的callback嵌套 或者用async库,或者Promise,或者async/await
@imhered promise 怎么改写啊 我改了半天也没改对 对promise 懵懵懂懂的
用promise,或者async框架
@HuarenYu 我也知道用这些 可是不会用啊
var query = function(sql){
return new Promise((resolve,reject)=>{
db.query(sql,(err,data)=>{
if(err) return reject(err);
resolve(data[0]);
})
})
}
var query1 = () => {
return new Promise((resolve, reject) = > {
db.query(`SELECT COUNT(*) FROM index_table `,(err,data)=>{
if (err) {
return reject(err);
}
resolve(data[0])
})
});
}
var query2 = () => {
return new Promise((resolve, reject) = > {
db.query(`SELECT username FROM index_table `,(err,data)=>{
if (err) {
return reject(err);
}
resolve(data[0])
})
});
}
var query3 = () => {
return new Promise((resolve, reject) = > {
db.query(`SELECT href FROM index_table `,(err,data)=>{
if (err) {
return reject(err);
}
resolve(data[0])
})
});
}
var datatotal = {};
query1().then((num) => {
datatotal.num = num;
return query2()
}).then((users) => {
datatotal.users = users;
return query3()
}).then((hrefs) => {
datatotal.hrefs = hrefs;
console.log(datatotal.num);
console.log(datatotal.users)
console.log(datatotal.hrefs)
res.render('index.ejs',{datatotal});
}).catch((err)=> {
// 错误处理
})
还有从你的代码看,你这3个查询应该一次就能查出来,不明白为什么要分开来查。 async的写法就把上面的query1().then… 整一串换成
var queryasync = async () => {
datatotal.num = await query1();
datatotal.users = await query2();
datatotal.hrefs = await.query3();
console.log(datatotal.num);
console.log(datatotal.users)
console.log(datatotal.hrefs)
return res.render('index.ejs',{datatotal});
}
queryasync();
@yinxin630 很感谢 你们这些 无私帮助别人的人 我也想帮助别人 可惜 刚入行能力还不行 再次感谢
@imhered 感谢 昨晚好好研究了一下 加上你们的代码 明白了很多 谢谢
@foora 感谢您的帮助 让我明白了很多 非常感谢 这三个查询 是我举得例子 祝您工作顺利;身体健康
@foora 问了问我们公司java 说得用两条 一条语句怎么查询啊
@hellojiakewei 不好意思,没看清楚第一是count(*),是应该两条的,第2和第3可以合并在一起查
@foora 看了你的建议 我专门打电话给了我的一个java 同学 然后给我讲了半天分组查询 存储过程 然后告诉我两条 sql。。。。
想玩 node 先看看 callback hell 是怎么回事儿,然后再进阶到 promise,最后上 async/await ,新手的话,理解透彻得花费好些时间吧
来来来,给你上个co版本,看起来你那里是可以并行查询的,是不是要比你的看起来优雅多了,然后你自己根据业务情况改改吧,有问题再提哦
const co = require('co');
const query = sql=> cb=> db.query(sql, (err,data)=>{err?cb(err):cb(null,data)});
server.get('/',(req,res)=>{
co(
function *(){
let [num, users, hrefs] = yield [
query(`SELECT COUNT(*) FROM index_table `),
query(`SELECT username FROM index_table `),
query(`SELECT href FROM index_table `)
];
res.render('index.ejs',{datatota:{num,users,hrefs}});
}
).catch(err=>res.render('error.ejs',{err}) )
});
没有那么复杂,所有sql语句写在一个字符串或者使用存储过程 自豪地采用 CNodeJS ionic
那个是sql层面的东西了,这里只是举例
@fantasticsoul 太猛了大神,我现在还有点理解不了这么深的东西 感觉理解起来有点费力,能不能加个好友什么的 以后向你请教下啊 我现在就遇到了一个困难,我正在做第三方QQ 登陆接口 ,可是本地开发环境下 怎么搞呢 ?我把host 文件改了 想把我的localhost 地址映射出去 ,去申请QQ 互联。
Can you feel the power from js ? hahahahahahahahahhaah
async version
server.get('/',(req,res)=>{
let [num, users, hrefs] = [null, null, null];
async.parallel([ //async.waterfall is a choice as well known
() => { db.query(`SELECT COUNT(*) FROM index_table `, arguments[arguments.length -1]) },
() => { db.query(`SELECT username FROM index_table `, arguments[arguments.length -1]) },
() => { db.query(`SELECT href FROM index_table `, arguments[arguments.length -1]) }
], (err, ret) => {
if(err) {// do what you wanna do}
let datatotal={ 'num': ret[0], 'users':ret[1], 'hrefs':ret[2] };
res.render('index.ejs',{datatotal});
});
});