使用 promise.then + 递归的方法异步转同步

在写 node.js 时遇到一个小问题。生成一笔订单时需要得到唯一的编号。

我的策略是将当前时间, new Date().getTime(), 拼接上一个从零开始的累加数。

我们先要去查询 redis 中是否已经有重复订单,然后再决定是累加还是直接返回当前拼接后得到订单号。

之后将得到的编号存入 redis,失效时间为 30 秒。

这里的重点在于 node.js 对 redis 的操作是异步的。

如果是同步的,我们只要使用 while 循环即可;但是对于异步的操作,我们就不得不使用递归以及 promise.then
代码如下:

/** 主程序 */

var timeStr = new Date().getTime()

, incr = 0;

Q.promise(function(resolve, reject){
selfOrderNoGenerator(timeStr, incr, resolve, reject)

}).then(function(orderNo){

// 将新生成的 orderNo 存入 redis 中
        var newKey = 'selfOrderNoGenerator' + orderNoGen;
        redisDao.client7891().set(newKey, 'Y');
        redisDao.client7891().expire(newKey, 30); // 生成的订单号在 redis 中生命设为 30 seconds

// 更多后续操作

... 

});


/** 递归排除重复项方法 */
function selfOrderNoGenerator(timeStr, incr, resolve, reject){
    var newOrderNo = String(timeStr) + String(incr);
    redisDao.client().hget('selfOrderNoGenerator', newOrderNo, function (err, feed) {
        if (!!err) {
            logger.error('selfOrderNoGenerator', err);
            reject({code: 110, msg: ' fail to generate order number for the offline trade'});
            return false;
        } else if (!feed) {
            resolve(newOrderNo);
            return false;
        }else {
            selfOrderNoGenerator(timeStr, ++incr, resolve, reject);
            return false;
        }
    });
}

你可能感兴趣的:(使用 promise.then + 递归的方法异步转同步)