循环执行异步功能

时间:2018-10-12 14:11:12

标签: javascript node.js

我正在编写一个函数,该函数会循环访问端口号,直到找到一个打开的端口:

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 个答案:

答案 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}}插入,则应将其删除。