将自定义then() - 方法添加到promisifyAll生成的每个函数中

时间:2015-12-03 20:46:28

标签: javascript node.js promise bluebird aerospike

我最近开始玩Aerospike和他们的Node driver。我认为数据库本身是惊人的,但客户端库有一个小小的打嗝:

// Read the same record from database 
client.get(key, function(err, rec, meta) {
  // Check for errors 
  if ( err.code == status.AEROSPIKE_OK ) {
    // The record was successfully read. 
    console.log(rec, meta);
  } else {
    // An error occurred 
    console.error('error:', err);
  }
});

当一切顺利时,不会将nullundefined作为错误返回,而是始终返回一个对象。如果err.code === 0一切顺利的话。这意味着该库不能用bluebird的promisifyAll包裹。

我尝试通过在then生成的每个函数之后添加另一个promisifyAll - 方法来解决此问题。

getPromise().then((err, rec, meta) => {
  if(err.code === 0) {
    return {rec: rec, meta: meta};
  } else {
    return Promise.reject();
  }
}

如果没有明确地手动执行每个功能,我无法工作。还有其他方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:4)

对于Bluebird的custom promisifier option来说,这是个例子:

var Promise = require('bluebird');
var aerospike = Promise.promisifyAll(require('aerospike'), {
    promisifier: function(originalFunction, defaultPromisifer) {
        return defaultPromisifer(function() {
            var last = arguments.length-1;
            var callback = arguments[last];
            arguments[last] = function weirdAerospikeCallback(err, rec, meta) {
                if (!err || err.code == status.AEROSPIKE_OK)
                    callback(null, {rec: rec, meta: meta});
                else
                    callback(err);
            };
            originalFunction.apply(this, arguments);
        });
    }
});