我可能在这里遗漏了一些非常明显的东西,但是我如何将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)
})
同时尝试访问"response“和"item",第二个参数似乎被忽略了……
result
{ data: 'some data' }
item
undefined
有没有一种方法可以在不更改函数的情况下做到这一点(实际上,它是一个库函数,所以我不能)。
发布于 2019-01-07 17:04:47
我不能决定我最喜欢哪种方法--3个答案都很棒。Yury Tarabanko的可能是最“标准”的,Alex G的是很好的通用的,estus的超级简单。
我不想让这个问题“悬而未决”,因为这不是真的,对其他寻找相同信息的人也没有用处。
如果有更好的方法来处理这个问题,请版主让我知道!
发布于 2019-01-04 21:13:31
util.promisify
主要用于带有function (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
,它有multiArgs
选择覆盖此案例
发布于 2019-01-04 21:26:25
您可以创建自己的promisify,其中您返回一个promise,该promise使用回调的参数进行解析,并在then块上解构它们。希望这能有所帮助。
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);
});
https://stackoverflow.com/questions/54039289
复制相似问题