Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点:util.promisify(),没有回调作为最终参数_Javascript_Node.js - Fatal编程技术网

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)
    一起使用,它将拉动您的自定义实现

  • 将其重新定义为nodeback样式(最后一次回调)
  • 重新定义它以在调用时强制类型(确保对此进行单元测试)

  • 在这种情况下,我甚至建议更改原始函数的参数-它违反了节点回退约定,使用起来很混乱。除非这是一个库,需要一个版本来打破改变等,只要改变所有的调用站点-这将是一个改进,以及:-)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)
    }