【发布时间】:2017-10-24 03:25:05
【问题描述】:
我有以下使用 mdns-js 包的发现代码。
在 ./lib/deviceDiscovery.js:
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
}
问题是第二个yield挂了;似乎 getDevices 函数返回的承诺并未无限期解决,尽管我看到各个承诺已解决。
startService 使用了类似的 Promise.all(...) 但它工作正常。
另一个相关问题是关于 mdns-js:似乎对于每个(输入)服务,浏览器都会收到多个更新。
但是我在第一次更新事件后解决了每个浏览器的承诺......我是否需要等待多个更新以及如何?
任何提示将不胜感激!谢谢。
【问题讨论】:
-
我不太明白使用
co()的好处。如果你只做DeviceDiscoveryService.startService(.......).then(DeviceDiscoveryService.getDevices).then(console.log);会发生什么
标签: javascript node.js promise mdns