向 promisifyAll 生成的每个函数添加自定义 then() 方法
Add custom then()-method to every function generated by promisifyAll
我最近开始玩 Aerospike and their 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);
}
});
当一切顺利时,不是返回 null
或 undefined
作为错误,而是总是发回一个对象。如果err.code === 0
一切顺利。这意味着库不能用bluebird的promisifyAll
.
包裹
我试图通过在 promisifyAll
.
生成的每个函数之后添加另一个 then
方法来解决这个问题
getPromise().then((err, rec, meta) => {
if(err.code === 0) {
return {rec: rec, meta: meta};
} else {
return Promise.reject();
}
}
如果不明确手动对每个功能执行此操作,我将无法使其工作。还有其他方法可以实现吗?
听起来这就是 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);
});
}
});
我最近开始玩 Aerospike and their 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);
}
});
当一切顺利时,不是返回 null
或 undefined
作为错误,而是总是发回一个对象。如果err.code === 0
一切顺利。这意味着库不能用bluebird的promisifyAll
.
我试图通过在 promisifyAll
.
then
方法来解决这个问题
getPromise().then((err, rec, meta) => {
if(err.code === 0) {
return {rec: rec, meta: meta};
} else {
return Promise.reject();
}
}
如果不明确手动对每个功能执行此操作,我将无法使其工作。还有其他方法可以实现吗?
听起来这就是 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);
});
}
});