2017-05-24 15 views
0

ですが、解決されませんmdns-jsパッケージを使用して次の検出コードがあります。
で./lib/deviceDiscovery.jsNodeJS: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についてです:各(入力)サービスのために、ブラウザが複数の更新を受けているようです。 しかし、私は最初の更新イベントの後に各ブラウザの約束を解決します...私は複数の更新を待つ必要がありますか?
ヒントをお待ちしております。ありがとう。

+0

私は実際に 'co()'を使う利点を理解していません。 'DeviceDiscoveryService.startService(.......)。do(DeviceDiscoveryService.getDevices).then(console.log);' – trincot

答えて

1

私はあなたが(代わりにサービスがすでに存在する場合は、未定義返すの)すべての回でcreateABrowserからの約束を返すことが、更新を共有していることを信じています。約束を返すことなく、私はPromise.all()が解決しないと思う。

代わりに、上部の約束を作成し、それはサービスがすでに存在する場合は解決し、そしてその約束を返します。

getDevices()呼び出しでは、そこに約束を返さずに拒否を実行しています。これは効果がありますか?

module.exports.getDevices = function() { 
    if (browsers.size == 0) { 
     // Create a new promise, return it, and immediately reject 
     return new Promise(function(resolve, reject) { reject('service was stopped') }; 
     // reject('service was stopped'); <- There wasn't a promise here 
    } 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; 
     }); 
    } 
} 
+0

サービスが既に存在している場合は、tksを更新しました。しかし_startService_はすでに動作していました。保留中の約束は_getDevices_のためのものですが、私は上にPromiseを返すように更新しましたが、この返された約束はまだ掛かっています... – sharpthor

+0

私は答えを編集しました。これをソートしたことはありますか? –