繁体   English   中英

节点:util.promisify() 没有回调作为最终参数

[英]Node: util.promisify() without callback as final parameter

我正在尝试使用util.promisify()来转换使用回调的 function 以便我可以使用 async/await 调用它: https://nodejs.org/dist/latest-v8.x/docs/api/util .html#util_util_promisify_original

到目前为止,我已经能够将它与将回调作为最终参数的函数一起使用,正如它所期望的那样。 但是当另一个项目是最终参数时,我对如何使用它感到困惑。

我有一个结构如下的 function:

myFunction = function(userID, company, callback, jwt) {
    ....
    return callback(null, results)
}

由于jwt是最终参数,我如何在此使用 promisify 并仍然通过jwt 我宁愿不更改原始 function 的结构,因为其他地方都按原样调用它

您可以在 function 周围创建一个新的 function 包装器,该包装器仅接受 arguments 以不同的顺序,以便最后移动回调:

const wrapper = (userID, company, jwt, callback) => 
    myFunction(userID, company, callback, jwt);

const promisified = utils.promisify(wrapper);

对于更通用的解决方案,您可以使用 Lodash 的rearg ,它将根据您给它的数组更改 arguments 的顺序:

const wrapper = _.rearg(myFunction, [0, 1, 3, 2]);

const promisified = utils.promisify(wrapper);

使用 function:

myFunction = function(userID, company, callback, jwt) {
    /* ... */
    return callback(null, results)
}

你有四个选择。

  1. 以不同的顺序将 function 与 arguments 包装起来:
util.promisify((userID, company, jwt, callback) => myFunction(userID, company, callback, jwt))
  1. 提供你自己的承诺者(假设你控制着代码)
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); 
  });
}

然后,您可以将其与utils.promisify(myFunction)一起使用,它将拉取您的自定义实现。

  1. 将其重新定义为 nodeback 样式(最后回调)
myFunction = function(userID, company, jwt, callback) {
    /* ... */
    return callback(null, results)
}
  1. 重新定义它以在调用时强制类型(确保对此进行单元测试)
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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM