nodeJS之解决巧用promise对象解决数据库查询逻辑

一.该函数返回指定回调callback的promise对象

const getPro = function(callback) {

return new Promise(callback)

}

二.创建promise实例解决回调地狱问题,难点:

1.抽离promise对象的构造函数出来,已达到实时创建promise,防止数据库查询错位

2.一个promise对象创建完毕后才执行下一个promise对象创建 ps:可以借此改变全局变量值已达到传值

3.promise对象里的异步操作仍是按照异步来执行,所以要把创建promise对象的实例放在上一个promise对象成功的回调函数里

var form = new formidable.IncomingForm(); //创建上传表单
    form.encoding = 'utf-8'; //设置编辑
    form.parse(req, function (err, fields) {
        const userName = fields.userName
        const userPwd = fields.userPwd
        const html = fields.html 
        var id
const q1 = 'select * from users where user_name=?and user_pwd=?'
        const prom1 = function(resolve,reject) {
            conn.query(q1,[userName,userPwd],(err,result) => {
                if(err) return reject({status: 500, msg: '数据库查询失败!'})
                if(result.length == 0) 
                    return reject({status: 501, msg: '用户名或密码错误!'}) 
                id = result[0].id           
                resolve()
            })
        }
        const q2 = 'select * from home where user_id=?'             
        const prom2 = function(resolve,reject) {
            conn.query(q2,id,(err,result) => {
                if(err) return reject({status: 300, msg: '数据库查询失败!'})
                if(result.length == 0)
                    return resolve('insert')
                resolve('update')
            })
        }
        const q3 = 'insert into home set user_name=?,html=?,user_id=?'
        const prom3 = function(resolve,reject) {
            conn.query(q3,[userName,html,id],(err,result) => {
                if(err)  return reject({status: 301, msg: '数据库查询失败!'})
                if(result.affectedRows == 0)
                    return reject({status: 502, msg: '保存失败!'})
                resolve({status: 200, msg: '保存成功!'})
            })
        }
        const q4 = 'update home set html=? where user_id=?'
        const prom4 = function(resolve,reject) {
            conn.query(q4,[html,id],(err,result) => {
                if(err)  return reject({status: 302, msg: '数据库查询失败!'})
                if(result.affectedRows == 0)
                    return reject({status: 503, msg: '修改失败!'})
                resolve({status: 200, msg: '修改成功!'})
            })
        }

三.实现数据库操作逻辑:

1.查询users表是否用户名密码正确

2.查询home表判断下步执行insert还是update操作

3.根据上一步查询结果执行insert/update home表操作

getPro(prom1)
        .then(() => {
            return getPro(prom2)
        },err => res.send(err))
        .then(msg => {
            if(msg == 'insert')
                return getPro(prom3)
            else return getPro(prom4)
        },err => res.send(err))
        .then(result => {
            res.send(result)
        },err => res.send(err))

转载于:https://my.oschina.net/u/3937325/blog/1926837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值