ですが、解決されません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.startService(.......)。do(DeviceDiscoveryService.getDevices).then(console.log);' – trincot