javascript - 在循环中执行异步函数
问题描述
我正在编写一个函数,它遍历端口号,直到找到一个打开的端口:
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:未处理的承诺拒绝。
解决方案
上面的代码有两个问题:
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
函数将 a赋值new Promise()
给portOpen
变量。因此,即使错误将由 处理try/catch
,portOpen === false
条件也会评估为,false
因为portOpen
将等于一个Promise
对象。如果没有理由对portOpen
值进行评估,new Promise
则应将其删除。
推荐阅读
- html - 我怎样才能实现这个设计?
- django - Django 使用当前用户设置表单集
- visual-studio-code - 如何在 Visual Studio Code 中运行我的 .jl 文件?
- nlp - 在 spacy 的预初始化 doc 对象上运行依赖解析器
- ruby-on-rails - 类型时间的输入语法无效,或者是
- javascript - 是否可以在没有 npm start 的情况下运行 node.js 项目?
- java - 如何使用 java 11 生成 native-debug-symbols 文件?
- python - 如何在 AWS 组织/特定组织单元中存在的所有账户中使用 boto3 获取特定 AWS 账户标签
- c++ - 递归函数中 substr 的时间复杂度
- firebase - Android Flutter如何显示在ListView中搜索到的数据?错误:未为类“对象”定义运算符“[]”