代码之家  ›  专栏  ›  技术社区  ›  Sasha Kos

端口是否可以通过承诺在循环中获得结果?

  •  3
  • Sasha Kos  · 技术社区  · 7 年前

    即时通讯使用 is-port-reachable 返回承诺的包。我想找到第一个免费(不可到达)的港口。所以我应该表演 IsPortReachable 在循环中。我想用 yield ,但有错误 SyntaxError: Unexpected strict mode reserved word (可结合产量)。如果我放弃承诺,错误就会消失。

    findPort () {
        function * checkPort() {
          let couldBeBinded = false;
    
          let port = this.port;
    
          do {
            IsPortReachable(this.port, {host: 'localhost'})
              .then(function (reachable) {
                "use strict";
    
                if (!reachable) { // not binded
                  couldBeBinded = true;
                } else {
                  port++;
                }
    
                if (port > 65534) {
                  return couldBeBinded;
                }
    
                yield couldBeBinded;
              });
          } while(!couldBeBinded && (port < 65534));
        }
    
        var generator = checkPort();
        let couldBeBinded = { value: false, done: false };
        while((couldBeBinded.value !== true) && (couldBeBinded.done !== false)) {
          couldBeBinded = generator.next();
          console.log(couldBeBinded);
        }
    }
    

    可能是我的代码完全错误,所以请建议我如何循环承诺 node . 谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   mihai    6 年前

    这是我解决这个问题的方法:

    const IsPortReachable = require('is-port-reachable');
    
    var options = {
      start_port : 2994,
      end_port : 3003,
      findFirstFree : true
    }
    
    function CheckPort(port, firstFree, callback) {
      IsPortReachable(port, {host: 'localhost'})
        .then((reachable) => {
          if (reachable) {
            console.log(port, "reachable");
            if (firstFree) callback(port);
          }
          else {
            console.log(port, "free")
            if (!firstFree) callback(port);
          }
        })
    }
    
    function CheckPortHandler(port, firstFree) {
        if (port >= options.end_port) return;
        CheckPort(port + 1, firstFree, CheckPortHandler)
    }
    
    CheckPort(options.start_port, options.findFirstFree, CheckPortHandler);
    

    您可以在选项中更改开始和结束端口。如果要查找第一个可到达的端口(与第一个可用端口相反),请更改 findFirstFree false .

    在代码中,我正在创建一个函数 CheckPort 它绕着 IsPortReachable 但也会收到一个回调。如果 reachable 状态不符合 firstFree 参数。回调是另一个调用 检查口 同样,使用一个递增的端口,因此该过程将继续。它一直持续到 可达成的 状态与 第一免费 参数,因此不再调用回调。

    可能有点混乱,但对我来说没问题。

    这里是输出 findFirstFree : true

    2994 'free'
    

    findFirstFree : false

    2994 'free'
    2995 'free'
    2996 'free'
    2997 'free'
    2998 'free'
    2999 'free'
    3000 'reachable'
    
    推荐文章