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知道是异步的原因,我这种代码还可以怎么写呢?
想了想, 还是给你推荐些promise, generator, async/await的资料吧 http://es6.ruanyifeng.com/#docs/promise http://es6.ruanyifeng.com/#docs/generator http://es6.ruanyifeng.com/#docs/async http://es6.ruanyifeng.com/#docs/generator-async
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();
想玩 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}) )
});
@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});
});
});