序
如果想直接用异步回调的方式, then这种,看这位兄台的博客就可以nodejs检查端口是否被占用(完美方案)
而我是想用同步写异步的方式去做 (async+await)
第一种失败尝试
var Promise = require('bluebird')
const net = require('net');
async function getFreePort() {
while (true) {
var port = debugPorts.shift()
var used = await portInUse(port)
if (!used || debugPorts.length === 0) {
break
}
}
if (debugPorts.length === 0) {
log.fatal('分配端口已达最大限额')
return null
}
return port
}
function portInUse(port){
return new Promise((resolve, reject)=>{
let server = net.createServer().listen(port);
server.on('listening',function(){
server.close();
resolve(port);
});
server.on('error',function(err){
if(err.code == 'EADDRINUSE'){
log.warn(err)
resolve(null)
}
});
});
}
可想而知,在while循环里我拿到的 portInUse的返回值只会是[object Promise]. 因为JS是单线程,事件驱动语言。
第二种成功尝试
var Promise = require('bluebird')
const net = require('net');
function getFreePort(){
return new Promise((resolve, reject)=>{
if (debugPorts.length === 0) {
log.info('分配端口已达最大限额')
return resolve(null)
}
var port = debugPorts.shift()
let server = net.createServer().listen(port);
server.on('listening',function(){
server.close();
resolve(port);
});
server.on('error',function(err){
if(err.code == 'EADDRINUSE'){
log.warn(err)
getFreePort()
}
});
});
}
async function getPort(){
var availablePort = await getFreePort();
}
Done.
续文中的debugPorts变量:
var debugPorts = range(12000, 12300)
function range(from, to) {
var items = []
for (var i = from; i <= to; ++i) {
items.push(i)
}
return items
}