【发布时间】:2019-05-22 20:59:59
【问题描述】:
我有一个执行长时间计算的函数,一旦完成,就会调用一个作为参数传递的回调函数。
我在 Koa 路由器中查询这个函数,需要将长时间计算的结果返回给浏览器。函数来自库,我无法更改其接口(即,我可以更改回调的代码,但无法更改 someLongComputation 以返回承诺)
当前代码集ctx.body 立即返回,someLongComputation 立即返回。知道如何等到回调被调用,然后才使用回调的结果设置ctx.body。
router.post(`/abc`, async (ctx) => {
try {
someLongComputation(function(err, res) {
if(err) {
console.log(err);
}
}
ctx.body = {
status: 'success',
data: {'res' : ""},
errors: []
};
} catch (err) {
console.log(err)
}
})
【问题讨论】:
-
是的,您可以更改
someLongComputation()以使用承诺:require('util').promisify(someLongComputation)返回您可以使用await的函数版本。 -
为简单起见,我省略了 someLongComputation 函数的实际名称。我正在尝试使用在调整大小后运行的 graphicsmagic 流函数来做到这一点: gm(request(photo)).resize(size[0], size[1]).stream 。在该代码上使用 promisify 似乎会返回错误:TypeError: format.split is not a function