我正在编写一个函数,该函数会循环访问端口号,直到找到一个打开的端口:
async function findPort (port, app, logger) {
const lookupPort = () => {
return portOpen = new Promise( (resolve, reject) => {
app.listen(port, () => {
logger.log("info", `Server listening on port: ${port}`);
resolve(true);
})
.on('error', (err) => {
logger.log("warn", "port closed: " + err.port);
reject(false);
});
});
}
let portOpen = false;
while (portOpen === false){
portOpen = await lookupPort();
port++;
}
执行时,它会循环访问一个端口,然后引发异常:
(节点:2869)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。
答案 0 :(得分:0)
上面的代码有2个问题:
1)while
循环停止执行,因为lookupPort
函数抛出未捕获(reject(false);
)的错误(承诺在UnhandledPromiseRejectionWarning: Unhandled promise rejection.
行被拒绝)。要解决此问题,请尝试将while
循环中的代码包装到try/catch
结构中:
while (portOpen === false){
try {
portOpen = await lookupPort();
}
catch (error) {
// handle an error here
}
port++;
}
或者,如果您不想履行在lookupPort
内拒绝的承诺,只需删除reject(false);
行。
2)lookupPort
函数将new Promise()
分配给portOpen
变量。因此,即使错误将由try/catch
处理,由于portOpen === false
等于false
对象,因此portOpen
条件的计算结果为Promise
。如果没有理由将portOpen
的值{@ {1}}插入,则应将其删除。