首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NodeJs:回调函数有多个参数的util.promisify

NodeJs:回调函数有多个参数的util.promisify
EN

Stack Overflow用户
提问于 2019-01-04 20:48:07
回答 5查看 7.7K关注 0票数 16

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

代码语言:javascript
复制
function awkwardFunction (options, data, callback) {
    // do stuff ...
    let item = "stuff message"
    return callback(null, response, item)
}

我可以这样叫它:

代码语言:javascript
复制
 awkwardFunction ({doIt: true},'some data', (err, result, item) => {
      console.log('result')
      console.log(result)
      console.log('item')
      console.log(item)
      done()
    })

然后回来

代码语言:javascript
复制
result
{ data: 'some data' }
item
stuff message

使用简化版本时:

代码语言:javascript
复制
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)
  })

同时尝试访问"response“和"item",第二个参数似乎被忽略了……

代码语言:javascript
复制
result
{ data: 'some data' }
item
undefined

有没有一种方法可以在不更改函数的情况下做到这一点(实际上,它是一个库函数,所以我不能)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-01-07 17:04:47

我不能决定我最喜欢哪种方法--3个答案都很棒。Yury Tarabanko的可能是最“标准”的,Alex G的是很好的通用的,estus的超级简单。

我不想让这个问题“悬而未决”,因为这不是真的,对其他寻找相同信息的人也没有用处。

如果有更好的方法来处理这个问题,请版主让我知道!

票数 1
EN

Stack Overflow用户

发布于 2019-01-04 21:13:31

util.promisify主要用于带有function (err, result): void签名的节点式回调。

可以手动处理多个参数:

代码语言:javascript
复制
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,它有multiArgs选择覆盖此案例

票数 25
EN

Stack Overflow用户

发布于 2019-01-04 21:26:25

您可以创建自己的promisify,其中您返回一个promise,该promise使用回调的参数进行解析,并在then块上解构它们。希望这能有所帮助。

代码语言:javascript
复制
function awkwardFunction (options, data, callback) {
    // do stuff ...
    let item = "stuff message";
    return callback(null, data, item);
}

const mypromisify = (fn) =>
    (...args) =>
        new Promise(resolve =>
            fn(...args,
                (...a) => resolve(a)
            )
        );

const kptest = mypromisify(awkwardFunction);

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54039289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档