Node中Promise库Q的使用
发布于 9 年前 作者 1043099804 11889 次浏览 最后一次编辑是 8 年前 来自 分享

研究了半天,发现直接自己写返回最好用。

var Q = require('q');

//用Q整合的函数都是调用mongoose的,返回查询表的结果或者创建新表
var findUserByNickname = Q.nfbind(UserProfileModel.findUserByNickname.bind(UserProfileModel));
//Q.nfbind 和Q.denodeify是一个东西,同名而已。

//使用 Q.defer()自定义合法返回的内容,注意要在回调函数外使用return deferred.promise的语法
var nameFind = function(exist){
 var deferred = Q.defer();
    if (exist) {
        message = "用户名重复";
        deferred.resolve(1);
        return deferred.promise;
    }else{
        UserProfileModel.findUserByEmail(email,function(err,user){
            if (user) {
                deferred.resolve(1);
                message = "邮箱重复";
            }else {
                deferred.resolve(0);
            };
        });
        return deferred.promise;
    };
}

var emailFind = function(exist){
    var deferred = Q.defer();
    if (exist==0){
        UserProfileModel.createSimpleUser(user_nickname,user_realname,email,password,userid,function(err,user){
            deferred.resolve(user);
            message = "注册成功";
        });
    return deferred.promise;
    }else{
        deferred.resolve(1);
        return deferred.promise;
    }
}

//最后直接调用函数的实例,function error自动收集error。
findUserByNickname(user_nickname)
.then(nameFind)
.then(emailFind)
.then(
function(data){
    res.send(message);
},function(error){
    res.sendError("注册失败");
    console.log(error);
});
3 回复
  • emailFind 中的 return Promise 可以抽出来放到底部
  • createSimpleUser 如果是自己写的话,应该重构成基于 promise,现在是 callback 和 promise 混在一起
  • emailFind 的话应该走 reject 流程

@klamtlne 重构成基于promise就是在mongoose里面直接返回个promise吗?

@1043099804 没用过 mongoose… 如果可以 UserProfileModel.createSimpleUser(params).then(func) 那是极好的

回到顶部