Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Node.js NodeJs:util.promisify,其中回调函数有多个参数_Node.js - Fatal编程技术网

Node.js NodeJs:util.promisify,其中回调函数有多个参数

Node.js NodeJs:util.promisify,其中回调函数有多个参数,node.js,Node.js,我可能在这里遗漏了一些非常明显的东西,但是如何将util.promisify与这样的函数一起使用呢 function awkwardFunction (options, data, callback) { // do stuff ... let item = "stuff message" return callback(null, response, item) } 我可以这样称呼它: awkwardFunction ({doIt: true},'some data

我可能在这里遗漏了一些非常明显的东西,但是如何将
util.promisify
与这样的函数一起使用呢

function awkwardFunction (options, data, callback) {
    // do stuff ...
    let item = "stuff message"
    return callback(null, response, item)
}
我可以这样称呼它:

 awkwardFunction ({doIt: true},'some data', (err, result, item) => {
      console.log('result')
      console.log(result)
      console.log('item')
      console.log(item)
      done()
    })
回来

result
{ data: 'some data' }
item
stuff message
使用承诺版本时:

let kptest = require('util').promisify(awkwardFunction)
kptest({doIt: true},'some data')
   .then((response, item) => {
    console.log('response')
    console.log(response)
    console.log('item')
    console.log(item)

 })
 .catch(err => {
     console.log(err)
  })
尝试访问“响应”和“项目”,似乎忽略了第二个参数

result
{ data: 'some data' }
item
undefined

有没有一种方法可以做到这一点而不改变函数(实际上,它是一个库函数,所以我不能)。

不可能有
。然后((response,item)=>{
,因为承诺表示单个值。但是你可以像这样拥有它
。然后({response,item})=>{
一个包含两个字段的对象

您需要为函数提供自定义promisify实现

const { promisify } = require('util')

awkwardFunction[promisify.custom] = (options, data) => new Promise((resolve, reject) => {
  awkwardFunction(options, data, (err, response, item) => {
    if(err) { reject(err) }
    else { resolve({ response, item }) }
  })
})

const kptest = promisify(awkwardFunction)

或者,如果这是唯一一个提示函数的地方,您可以直接使用提示版本
const kptest=(选项,数据)=>newpromise(…
w/o附加提示步骤。

util.promisify
用于带有
函数的节点样式回调(err,result):void
签名

可以手动处理多个参数:

let kptest = require('util').promisify(
  (options, data, cb) => awkwardFunction(
    options,
    data,
    (err, ...results) => cb(err, results)
  )
)

kptest({doIt: true},'some data')
.then(([response, item]) => {...});

如果需要更复杂的功能,可以使用一些第三方解决方案,如
pify
,而不是
util.promisify
,它必须涵盖这种情况。

您可以制作自己的promisify,其中您返回一个承诺,通过回调参数进行解析,然后在块上对它们进行分解。希望如此这很有帮助

function awkwardFunction(选项、数据、回调){
//做些事情。。。
让item=“stuff message”;
返回回调(空、数据、项);
}
const mypromisify=(fn)=>
(…args)=>
新承诺(解决=>
fn(…args,
(…a)=>解析(a)
)
);
常数kptest=mypromisify(awkwardFunction);
kptest({doIt:true},'some data')
。然后(([错误、响应、项目])=>{
控制台日志(响应);
控制台日志(项目);
})
.catch(错误=>{
控制台日志(err);

})
我无法决定我最喜欢哪种方法-所有3个答案都很好。尤里·塔拉班科的答案可能是最“标准”的,亚历克斯·G的很普通,埃斯特斯的超级简单

我不想让这个问题“没有答案”,因为这不是真的,对于其他寻找相同信息的人来说也没有用处


如果有更好的方法来处理这个问题,请主持人告诉我!

我刚刚卷起袖子准备做一个心脏直视手术来达到这个目的,但我很高兴我发现有人已经做了这个

如果您使用的是's
Promisify
(它变得越来越流行),那么实际上有一个
{multiArgs:true}
的标志,您可以通过它,并将在这里执行您需要的操作!()


它将回调的多个参数转换为一个数组。因此,在我的例子中,默认回调有3个参数
(错误、结果、字段)
,使用典型的promisify无法获取
字段。但是通过传递
{multiArgs:true}
标志,解析值将成为
的数组[结果,字段]

啊,好主意。我不知道为什么我从来没有想过使用匿名函数!只是要补充一点-如果使用匿名函数直接导致typescript选择错误的重载,这非常有用。哦-太棒了。我发现了[promisify.custom],但无法确定如何使用它。不
[promisify.custom]
导致
promisify
返回该值,而不是它本来会返回的值?如果是这样,我认为这相当于将自定义函数直接分配给
ktest
@paulmelnikow好吧,是的。这就是我在这里试图说的“或者,如果这是唯一一个承诺函数的地方,您可以直接使用承诺版本const kptest=(选项、数据)=>newpromise(…不需要额外的承诺步骤)。”这也是一个好主意。对我来说,分解是一种新的方法,所以我从未想过这种方法。