请教这段数据库代码中的回调该怎么拉平
发布于 1年前 作者 gastrodia 562 次浏览
        knex('user').where('username',postUser.username).select().then(function(resp){
            if(resp.length>0){
                req.flash('error','您输入的用户名已存在!');
                res.redirect('/user/reg');
            }else{
                knex('user').where('email',postUser.email).select().then(function(resp){
                    if(resp.length){
                        req.flash('error','您输入的邮箱已存在!');
                        res.redirect('/user/reg');
                    }else{
                        knex('user').returning('id').insert({
                            username:postUser.username,
                            password:password,
                            email:postUser.email,
                            realname:postUser.realname}).then(function(resp){
                                if(resp[0]){
                                    req.flash('success','注册成功,返回登录!');
                                    res.redirect('/user/reg');
                                };
                            })
                    }
                })
            }
        });
7 回复

用 eventproxy。

把这2句

                        req.flash('error','您输入的邮箱已存在!');
                        res.redirect('/user/reg');

变成一个 error 事件。每次 ep.emit(‘error’).

  1. 查询重复 username 和 email 的语句让它们并行。

然后设个事件 ep.all('email_no_concilct’, 'username_no_conflict’, function () {// do sth})

  1. 总的来说,就是每一个逻辑块,都把它抽象成一个或多个事件的发生,并通过监听和抛出来使之扁平。
var ep = new eventproxy();

ep.on('confilict', function (msg) {
  req.flash('error', msg);
  res.redirect('/user/reg');
});

knex('user').where('username',postUser.username).select().then(function(resp){
  if(resp.length>0){
    return ep.emit('confilict', '您输入的用户名已存在!');
  }
  ep.emit('username_ok');
});

knex('user').where('email',postUser.email).select().then(function(resp){
  if(resp.length){
    return ep.emit('confilict', '您输入的邮箱已存在!');
  }
  ep.emit('email_ok');
});

ep.all('email_ok', 'username_ok', function (email, username) {
  knex('user').returning('id').insert({
    username:postUser.username,
    password:password,
    email:postUser.email,
    realname:postUser.realname}).then(function(resp){
      if(resp[0]){
        req.flash('success','注册成功,返回登录!');
        res.redirect('/user/reg');
      }
    });
});

感谢楼上各位朋友的回复,最终我还是用了knex自带的when.js

        knex('user').where('username',postUser.username).select()
            .then(function(resp){
                if(resp.length>0){
                    return when.reject({info:'您输入的用户名已存在!',redirect:'/user/reg'});
                }else{
                    return knex('user').where('email',postUser.email).select()
                }
            })
            .then(function(resp){
                if(resp.length>0){
                    return when.reject({info:'您输入的邮箱已存在!',redirect:'/user/reg'});
                }else{
                    return knex('user').returning('id').insert({
                        username:postUser.username, password:password,
                        email:postUser.email, realname:postUser.realname
                    });
                }
            })
            .then(function(resp){
                if(resp[0]){
                    req.flash('success','注册成功,返回登录!');
                    res.redirect('/user/reg');
                };
            })
            .otherwise(function(error){
                if(error){
                    req.flash('error',error.info);
                    res.redirect(error.redirect);
                }
            })

虽然拉平了,但是感觉代码依然还是很丑陋 呵呵

@lz http://callbackhell.com/ 看下这篇文章,可以结合一下里面提到的几个小技巧

好的,谢谢

回到顶部