2016-01-12 24 views
0

我有以下測試代碼;藍鳥傳播通過ping模塊返回undefined

var Promise = require("bluebird"); 
var ping = require('ping'); 
Promise.promisifyAll(ping); 

Promise.some([ 
    ping.sys.probe("google.com"), 
    ping.sys.probe("yahoo.com"), 
    ping.sys.probe("microsoft.com"), 
    ping.sys.probe("facebook.com") 
], 2).spread(function (first, second) { 
    debugger; 
    console.log(first, second); 
}).catch(Promise.AggregateError, function (err) { 
    err.forEach(function (e) { 
     console.error(e.stack); 
    }); 
}).error(function(err){ 
    console.log("error: " + err); 
}); 

// ping.sys.probe("google.com", function(isAlive){ 
//   var msg = isAlive ? 'host ' + "google.com" + ' is alive' : 'host ' + "google.com" + ' is dead'; 
//   console.log(msg); 
//  }); 

由於某種原因,函數進入傳播處理函數,但是這兩個值都是未定義的。 ping module自然支持承諾和promisifyAll可能在那裏是不必要的。

在我的實現中會丟失什麼?

+0

它傳播到你的錯誤處理程序嗎? Promisify需要一個節點'err,result'回調,而'probe'方法只返回一個參數。您可能需要創建自定義函數而不是promisify或使用[this](http://stackoverflow.com/questions/24194808/bluebird-promisify-and-callback-with-no-error-argument)。 –

+1

實際上,在查看庫後,您可以使用'ping.promise.probe('site')' –

+0

@ BenFortune啊,我錯過了這一點!感謝您的注意,並且在我使用之後,它按預期工作。 –

回答

0

您需要使用承諾方法,而不是在ping.promise。圖書館不需要promisifying,所以你可以把它拿出來。

Promise.some([ 
    ping.promise.probe("google.com"), 
    ping.promise.probe("yahoo.com"), 
    ping.promise.probe("microsoft.com"), 
    ping.promise.probe("facebook.com") 
], 2).spread(function (first, second) { 
    debugger; 
    console.log(first, second); 
}).catch(Promise.AggregateError, function (err) { 
    err.forEach(function (e) { 
     console.error(e.stack); 
    }); 
}).error(function(err){ 
    console.log("error: " + err); 
});