首页 > Promise流程控制 then中也需要resolve+reject的问题?

Promise流程控制 then中也需要resolve+reject的问题?

function User(user, mysqlConnection) {
    this.id = user.id;
    this.name = user.name;
    this.phone = user.phone;
    this.password = user.password;
    this.resumeId = user.resumeId;

    this.db = mysqlConnection;
}

module.exports = User;

// 存储用户信息
User.prototype.save = function(callback) {
    var that = this;

    var user = {
        name: this.name,
        phone: this.phone,
        password: this.password
    };

    // 简历外键
    if (this.resumeId) user.resumeId = this.resumeId;

    // 检查是否注册过
    User.get(this.phone, this.db, function(err, result) {
        if (err) {
            callback(err);
        } else {
            if (result.length) {
                // 已经注册过
                callback(null, false);
            } else {
                // 没有注册过 写入数据库
                var query = that.db.query('insert into user set ?', user, function(err, result) {
                    if (err) {
                        callback(err);
                    } else {
                        callback(null, result.insertId);
                    }
                });
            }
        }
    });
};

// 获取用户信息
User.get = function(phone, mysqlConnection, callback) {
    var query = mysqlConnection.query('select * from user where phone = ?', phone, function(err, result){
        if(err) callback(err);
        callback(null, result);
    });
};

上面是基于原型的对于用户信息的存储、查重的写法,因为牵涉到数据库的操作,用回调的方式来写不是很清晰,所以准备换成Promise的方式来组织代码,主要的问题在于需要实现这样的逻辑:

  1. 先判断用户是否存在

  2. 在进行插入数据库的新建用户的操作

  3. 回到主路由实现页面的渲染

下面这种写法有误,对于Promise的理解还是不到位,请指教。

function Manager(manager, mysqlConnection) {
    this.id = manager.id;
    this.name = manager.name;
    this.phone = manager.phone;
    this.password = manager.password;
    this.companyId = manager.companyId;

    this.db = mysqlConnection;
}

var Q = require('q');

module.exports = Manager;

Manager.prototype.save = function() {
    var that = this;

    return Q.promise(function(resolve, reject) {
        Manager.get(that.phone, that.db).then(function(data) {
            if (data.length) {
                // 该手机号已经注册过了
                resolve(false);
            } else {
                var manager = {
                    name: that.name,
                    phone: that.phone,
                    password: that.password
                };

                // 简历外键
                if (that.companyId) manager.companyId = that.companyId;

                // 没有注册过 写入数据库
                var query = that.db.query('insert into manager set ?', manager, function(err, result) {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(result.insertId);
                    }
                });
            }
        });
    });
};

Manager.get = function(phone, mysqlConnection) {
    return Q.promise(function(resolve, reject) {
        mysqlConnection.query('select * from manager where phone = ?', phone, function(err, result) {
            if (err) {
                reject(err);
            } else {
                resolve(result[0]);
            }
        });
    });
}

// in main route.js
var Manager = require('manager.js');

var manager = new Manager({...});

manager.save().then(function(resolve, reject){xxx}); 

不知道你用的数据库驱动程序是什么,一般的都支持promise的写法。如node-mysql。所以我一般会这么写

// 存储用户信息
User.prototype.save = function() {
    //...
    
    return User.get(this.phone, this.db)
    .then((result) => {
      if(result.length > 1) {
        // 已经注册过
        return false
      }
      
      // 没有注册过 写入数据库
      return that.db.query('insert into user set ?', user)
    })
    .then((res) => {
      if (!res) {
        // 已经注册过或者写入失败
        return false
      }
      
      // 没有注册过
      return res.insertId
    })
};

差不多是这样。User的save方法也是返回一个promise。

new User().save()
.then((res) => {
  // todo
})

manager.save().then(function(result) {

  // do something
  // ...
}, function(reason) {

  // do something
  // ...
});
【热门文章】
【热门文章】