【求助】我的promise写的又丑又蠢 - CNode技术社区

【求助】我的promise写的又丑又蠢
发布于 10 年前 作者 CarlosRen 4907 次浏览 最后一次编辑是 9 年前 来自 问答

在使用的promise的时候,我有希望在then之后再执行一个promise,但是多次执行之后就有很深的嵌套了,如下文的register,感觉没有抓住Promise的精髓,请大大们指导

//dboperation
exports.getPool = function(sql){
	return new Promise(function(resolve,reject){
		pool.getConnection(function(err,connection){
			if(err){
				reject('error connecting: ' + err.stack);
			}else{
				connection.query(sql,function(Err,Rows){
					if(Err){
						reject('error connecting: ' + Err.stack);
					}
					connection.release();
					resolve(Rows)
				});
			}
		})
	});
}	
//server
function register(socket,username, password, petname){
 var REGISTER = 0,
 p1 = dbobj.getPool("select * from user_table where Username='"+username+"'");
 p1.then(function(data){
 console.log(data);
 if(data.length === 1){
 REGISTER = -1;
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 }else{
 var p2 = dbobj.getPool("select count(*) from user_table");
 p2.then(function(data){
 var id = data[0]["count(*)"] + 1,
 sql = "insert into user_table (id,username,password,petname,avatar) values(?,?,?,?,?)",
 inserts = [
 id,
 username, 
 password, 
 petname,
 null
 ];
 sql = mysql.format(sql,inserts);
 var p3 = dbobj.getPool(sql);
 p3.then(function(data){
 var p4 = dbobj.getPool("select * from user_table where Username='"+username+"'");
 p4.then(function(data){
 console.log(data);
 if(data.length === 1){
 REGISTER = 1;
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 }else{
 REGISTER = "error";
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 }
 })
 .catch(function(err){
 console.log("insert into user_table"+err)
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 })
 })
 .catch(function(err){
 console.log("insert into user_table"+err)
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 })
 })
 .catch(function(err){
 console.log("select count(*) from user_table"+err)
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 });
 }
 })
 .catch(function(err){
 console.log("select * from user_table"+err)
 socket.emit('REGIST_RESULT', { REGISTER: REGISTER});
 }); 
}
io.on('connection', function (socket) {
 socket.emit('news', { hello: 'world' });
 socket.on('REGISTER', function (username, password, petname) {
 console.log(new Date()); 
 register(socket,username, password, petname);
 }) 
});
//client
socket.emit('REGISTER',"test", "zxcz", "petname");
socket.on('news', function (data) {
 console.log(data);
})
socket.on("REGIST_RESULT",function(data){
 console.log(data);
})
6 回复

你这个就是promise.then就完了,然后其他就在then里继续执行promise,写jquery的链式思想哪去了。

	promise1
		.then(()=> promise2)
		.then(()=> promise3)
		...
		.then(()=> data)

@hellopao untitled1.png

骚年promise和co模块一起用才是真的爽

@CarlosRen

  1. 不希望继续执行就 reject 啊,把这种情况当作是 exception 处理

  2. 另外你的代码有 SQL 注入

  3. var id = data[0]["count(*)"] + 1, 这个处理毫无必要,使用自增字段即可

主要还是思路没改过来〜

@ChiChou 帮一个朋友写服务器,他那么写的逻辑,我并不打算优化 已经反应过来了,throw出来就可以了,原来对异常的理解just是Error,没考虑过逻辑代码上这么做,感谢帮助

回到顶部

AltStyle によって変換されたページ (->オリジナル) /