Estoy intentando util.promisify el paquete bonjour npm . Este es el caso de uso original descrito en los documentos:
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) }) Y esto no saldrá: bonjour.find() permanece abierto buscando servidores http.
Quiero prometer esto y resolver con éxito la promesa después de buscar servidores. Algo como:
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'); } })(); Como se indica en los comentarios, siempre generará un error, aunque el valor de err sea el resultado deseado.
El proceso prometido espera un código de salida 0, que sospecho que no está sucediendo ya que el proceso no regresa. ¿Es esta la suposición correcta? ¿Alguien tiene alguna otra idea o solución para obtener mi promesa de no arrojar un error pero devolver el valor que se está arrojando actualmente?
¡Gracias!
Esto se debe a que la devolución de llamada de bonjour no cumple con la firma de devolución de llamada de Node.js (err, data) => {} . De hecho, la devolución de llamada de bonjour.find tiene el valor de éxito como primer parámetro. Podría envolverlo en una función de proxy como esta:
function findWrapper(options, func) { function callback(data, err) { func(err, data); } return bonjour().find(options, callback); } const find = util.promisify(findWrapper);