这种代码该怎么操作?原谅我是小白
发布于 7 年前 作者 hellojiakewei 4312 次浏览 来自 问答
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知道是异步的原因,我这种代码还可以怎么写呢?

21 回复

不用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});
	});
});
回到顶部