不退出的 Promisify 函数

Promisify function that does not exit

我正在尝试 util.promisify bonjour npm package。这是文档中描述的原始用例:

var bonjour = require('bonjour')()
 
// advertise an HTTP server on port 3000
bonjour.publish({ name: 'My Web Server', type: 'http', port: 3000 })
 
// browse for all http services
bonjour.find({ type: 'http' }, function (service) {
  console.log('Found an HTTP server:', service)
})

这不会退出 - bonjour.find() 保持打开状态寻找 http 服务器。

我想承诺这个,并在扫描服务器后成功解决承诺。类似于:

var bonjour = require('bonjour')
const util = require('util');
 
// advertise an HTTP server on port 3000
bonjour().publish({ name: 'My Web Server', type: 'http', port: 3000 })

// promisify the 'find' function
const find = util.promisify(bonjour().find.bind(bonjour()));

(async () => {
    try {
        const content = await find({ type: 'http' });
        console.log(content)
    } catch (err) {
        // It will always error, although, the value of 'err' is the correct content.
        console.error('There was an error');
    }
})();

如评论中所述,它总是会抛出错误,即使 err 的值是所需的输出。

promisify 进程需要退出代码 0,我怀疑这不会发生,因为进程没有 return。这是正确的假设吗?有没有人有任何其他见解或解决方案来让我承诺不抛出错误但 return 当前抛出的值?

谢谢!

那是因为bonjour回调不符合Node.js回调签名(err, data) => {}。实际上,bonjour.find 的回调将成功值作为第一个参数。您可以将其包装在这样的代理函数中:

function findWrapper(options, func) {

  function callback(data, err) {
    func(err, data);
  }

  return bonjour().find(options, callback);
}

const find = util.promisify(findWrapper);