Javascript 节点:util.promisify(),没有回调作为最终参数
我正在尝试使用Javascript 节点:util.promisify(),没有回调作为最终参数,javascript,node.js,Javascript,Node.js,我正在尝试使用util.promisify()转换使用回调的函数,以便使用async/await调用它: 到目前为止,我已经能够将它与回调作为最终参数的函数一起使用,正如它所期望的那样。但当另一项是最终参数时,我对如何使用它感到困惑 我有一个如下结构的函数: myFunction = function(userID, company, callback, jwt) { .... return callback(null, results) } 既然jwt是最后一个参数,我如何在
util.promisify()
转换使用回调的函数,以便使用async/await调用它:
到目前为止,我已经能够将它与回调作为最终参数的函数一起使用,正如它所期望的那样。但当另一项是最终参数时,我对如何使用它感到困惑
我有一个如下结构的函数:
myFunction = function(userID, company, callback, jwt) {
....
return callback(null, results)
}
既然
jwt
是最后一个参数,我如何在这个参数上使用promisify,并且仍然传递jwt
?我不想更改原始函数的结构,因为其他地方正在按原样调用它您可以在函数周围创建一个新的函数包装器,它只接受不同顺序的参数,以便将回调移到最后:
const wrapper = (userID, company, jwt, callback) =>
myFunction(userID, company, callback, jwt);
const promisified = utils.promisify(wrapper);
对于更通用的解决方案,您可以使用Lodash,它将根据您提供的数组更改参数顺序:
const wrapper = _.rearg(myFunction, [0, 1, 3, 2]);
const promisified = utils.promisify(wrapper);
使用功能:
myFunction = function(userID, company, callback, jwt) {
/* ... */
return callback(null, results)
}
你有四个选择
utils.promisify(myFunction)
一起使用,它将拉动您的自定义实现
在这种情况下,我甚至建议更改原始函数的参数-它违反了节点回退约定,使用起来很混乱。除非这是一个库,需要一个版本来打破改变等,只要改变所有的调用站点-这将是一个改进,以及:-)Lodash函数正是我所需要的。非常感谢。
util.promisify((userID, company, jwt, callback) => myFunction(userID, company, callback, jwt))
myFunction[util.promisify.custom] = function (userID, company, jwt) {
return new Promise((resolve, reject) => {
const callback = (err, result) => err ? reject(err) : resolve(result);
myFunction.call(this, userID, company, callback, jwt);
});
}
myFunction = function(userID, company, jwt, callback) {
/* ... */
return callback(null, results)
}
myFunction = function(userID, company, callbackOrJwt, jwtOrCallback) {
const [callback, jwt] = callbackOrJwt !== null && typeof callbackOrJwt === 'object'
? [jwtOrCallback, callbackOrJwt] // possibly called with jwt first
: [callbackOrJwt, jwtOrCallback]; // possibly called with callback first
/* ... */
return callback(null, results)
}