mdns-js 패키지를 사용하여 다음과 같은 검색 코드가 있습니다.
에 ./lib/deviceDiscovery.js이 추천NodeJS : Promise.all에 의해 반환 된 약속은 개별 약속이 있지만 해결되지 않았습니다
var mdns = require('mdns-js');
const browsers = new Map();
const INFINITE = -1;
function createABrowser(theServiceType, timeout) {
if (browsers.has(theServiceType)) {
return;
}
return new Promise(function(resolve, reject) {
var browser = mdns.createBrowser(theServiceType);
browser.on('ready', function() {
browsers.set(theServiceType, browser);
resolve(browser);
});
if (timeout != INFINITE) {
setTimeout(function onTimeout() {
try {
browser.stop();
browsers.delete(browser.serviceType);
} finally {
reject('browser ' + browser.toString() + ' timed out.');
}
}, timeout);
}
});
}
module.exports.startService = function(services, timeout) {
timeout = timeout || INFINITE;
promises = [];
services.forEach(function(service) {
promises.push(createABrowser(service, timeout));
});
return Promise.all(promises);
}
module.exports.stopService = function() {
browsers.values().forEach(function(browser) {
browser.stop();
});
browsers.clear();
}
module.exports.getDevices = function() {
if (browsers.size == 0) {
reject('service was stopped');
} else {
const promises = [];
for (let browser of browsers.values()) {
promises.push(new Promise(function(resolve, reject) {
try {
browser.discover();
browser.on('update', function(data) {
mfps = new Set();
const theAddresses = data.addresses;
theAddresses.forEach(function(element) {
mfps.add(element);
});
resolve(mfps);
});
} catch(err) {
reject(err);
}
}));
};
return Promise.all(promises).then(function(values) {
return new Set(values);
}, function(reason) {
return reason;
});
}
}
다른 파일을 사용
const DeviceDiscoveryService = require('./lib/deviceDiscovery');
var co = require('co');
co(function *service() {
yield DeviceDiscoveryService.startService([internetPrinter, pdlPrinter, unixPrinter], TIMEOUT);
yield DeviceDiscoveryService.getDevices();
}).catch(onerror);
function onerror(err) {
// log any uncaught errors
}
문제는 제 수율이 중단이고; getDevices 함수에 의해 반환 된 약속은 무기한 해결되지 않는 것으로 보입니다. 개별 약속이 해결 된 것을 볼 수 있습니다.
startService은 유사한 Promise.all (...)을 사용하지만 잘 작동합니다.
또 다른 관련 질문은 mdns-js에 관한 것입니다. 각 (입력) 서비스에 대해 브라우저가 여러 업데이트를받는 것으로 보입니다. 하지만 첫 번째 업데이트 이벤트 후 각 브라우저에 대한 약속을 해결합니다 ... 여러 업데이트 및 방법을 기다릴 필요가 있습니까?
힌트를 주시면 감사하겠습니다. 감사.
나는'co()'를 사용하는 이점을 정말로 모르겠다. (DeviceDiscoveryService.getDevices) .then (console.log); ' – trincot