今天花时间把部分回调代码 Promise化
发布于 2天前 作者 jerrywu55 213 次浏览 来自 分享

Promise化后代码 回调地狱解决了一些。组织起来也更流畅了。 下面举一个最小例子。

原来代码:

    userDao.findById = function (userId,callback) {
        var sql = 'select * from user where user_id = ?';
        var args = [userId];
    
        mysql.query(sql, args, function (err, users) {
            callback(err,users);
        })
    }

原来的调用

    userDao.findById(1234, function (err, users) {
        if(!users.length < 1){
            return callback(new Error('用户不存在'))
        }
    
        var user = users[0];
        userDao.updateScoreByUser(user.user_id, function (err, result) {
            // ...
            // 可能继续回调嵌套
        })
    })

函数 Promise 化后

    userDao.findById = function (userId) {
        var sql = 'select * from user where user_id = ?';
        var args = [userId];
    
        return new Promise(function (fulfill, reject) {
            mysql.query(sql, args, function (err, users) {
                if (err) {
                    debug(err);
                    return reject(err);
                }
    
                fulfill(users[0]);
            })
        });
    }

使用:

    userDao.findById(1234)
        .then(function (uers) {
            if(users.length < 1){
                throw new Error('用户不存在');
            }
    
            var user = users[0];
            return userDao.updateUserScore(user.user_id);
        })
        .then(function (updateResult) {
            // todo ...
    
        })
        .then(function (continueResult) {
            // 如果还有回调查询,继续 返回Promise ,然后 .then .then .then...
        })
        .catch(function (err) {
            // 会捕捉 throw 的 error
        })
9 回复

回调地狱别太多层就好。

@leapon 写了这么久node. 居然越来越对这种异步代码感到发慌,总担心一不小心服务器就挂了。。。。。

虽然异步是node的卖点,但我总觉得是反人类的一个设计…如果设计成“默认是同步,需要时才声明为异步”,就会发现世界有多美好

你为什么不用async

你为什么不用co

@chloe 之前一直用 async 感觉回调还是很不爽,尝试了下 Promise

@L3au 改天学习下 co ,搭一个koajs 项目

直接从 mysql 开始改…

  1. 有现成的用现成的,例如找找co-mysql
  2. 没现成的用Promiseify
  3. 手动new Promise

conn.query 的 callback(err,rows,fields) , (yield queryAsync(sql))[0] 才是rows …

为毛不分开 ExecuteNonQuery / ExecuteScalar / ExecuteQuery 这是sql server的

回到顶部