首页 > 解决方案 > 在循环中执行异步函数

问题描述

我正在编写一个函数,它遍历端口号,直到找到一个打开的端口:

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:未处理的承诺拒绝。

标签: javascriptnode.js

解决方案


上面的代码有两个问题:

1)while循环停止执行,因为函数抛出未捕获lookupPort的错误(在线拒绝承诺)( )。要解决此问题,请尝试将循环内的代码包装到构造中:reject(false);UnhandledPromiseRejectionWarning: Unhandled promise rejection.whiletry/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/catchportOpen === false条件也会评估为,false因为portOpen将等于一个Promise对象。如果没有理由对portOpen值进行评估,new Promise则应将其删除。


推荐阅读