Portál AbcLinuxu, 12. července 2025 22:28


Dotaz: node.js a získanie premennej z callback funkcie

27.4.2017 21:11 Peter
node.js a získanie premennej z callback funkcie
Přečteno: 462×
Odpovědět | Admin
Dobrý deň vám prajem.

Potrebujem zistiť či port je open alebo closed, tak skúšam vytvoriť nasledovnú funkciu:
function sleep(delay) {
  var start = new Date().getTime();
  while(new Date().getTime() < start + delay);
}

function tcpPortStatus(host, port, wait, delay) {
  var check = 'closed';
  var start = new Date().getTime();
  while(new Date().getTime() < start + delay) {
    var socket = net.createConnection(port, host);
    socket.on('data', function() {
      check = socket.readyState;
      console.log(socket.readyState);
    });
    if(check == 'open') {
      break;
    }
    sleep(wait);
  }
  return check;
}

document.write(tcpPortStatus('127.0.0.1', '5900', 500, 2000));
a potrebujem zo "socket.on" získať socket.readyState do premennej check.

Nájde sa tu dobrá duša čo mi ukáže ako na to?

Za odpovede vopred veľmi pekne ďakujem.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.4.2017 23:47 chrono
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak je port zatvorený (alebo je spojenie odmietnuté, ...), tak pokus o pripojenie vyvolá výnimku (a predpokladám, že sa zavolá aj obsluha pre "error").
28.4.2017 06:45 Peter
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
No to áno, ale to nie je odpoveď na moju otázku. Je mi jasné, že javascript je asynchrónny, ale niekedy proste je potrebné počkať na výsledok. Hrám sa s await, promise, ... ale zatiaľ tomu neviem prísť na koreň.
28.4.2017 08:18 alfonz
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
Bohužel dostat odpověď s callbacku nelze moc jednoduše. Nevím jak v případě připojení přes socket ale xhtmlrequest má možnost zadat synchronní požadavek. Druhá možnost je použít Promise a následně then(). Nyní používám generator a yield - Async function a await je podobne. Jiné možnosti moc nejsou.
29.4.2017 18:51 Peter
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
Ved práveže viem o Promise, len netuším ako na to, toto je ďalší pokus, ktorý mi samozrejme stále nefunguje:
      function tcpPortStatus(host, port, wait, delay) {
        var check = 'closed';
        var start = new Date().getTime();
        while(new Date().getTime() < start + delay) {
          var client = net.createConnection(port, host);
          check = new Promise(function(callback) {
            client.on('data', function() {
              callback(client.readyState);
            });
          }).then(function(callback) { console.log(callback); return callback; });

          document.write(check);
          console.log(check);

          if(check == 'open') {
            break;
          }
          sleep(wait);
        }
        return check;
      }

      document.write(tcpPortStatus('127.0.0.1', '5900', 500, 2000) + '
');
29.4.2017 20:01 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
-- OldFrog
30.4.2017 06:42 Peter
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
No pravdupovediac som z toho stále blbý, v konzole tú hodnotu samozrejme vidím, ale stále ju neviem dostať do premennej. Ďalší pokus:
      function sleep(timeout) {
        var start = new Date().getTime();
        while(new Date().getTime() < start + timeout);
      }

      async function tcpAsyncWrapper(host, port) {
        return await tcpPortCheck(host, port);
      }

      function tcpPortCheck(host, port) {
        var client = net.createConnection(port, host);
        return new Promise(function(resolve, reject) {
          client.on('data', function() {
            resolve(client.readyState);
          });
        }).then(function(resolve) { return resolve; });
      }

      function tcpPortStatus(host, port, retry, timeout) {
        var check = 'closed';
        var start = new Date().getTime();
        while(new Date().getTime() < start + timeout) {


          check = tcpAsyncWrapper(host, port)
          console.log(check);
          document.write(check);


          if(check == 'open') {
            break;
          }
          sleep(retry);
        }
        return check;
      }

      document.write(tcpPortStatus('127.0.0.1', '5900', 500, 2000));
Je vôbec možné v JS urobiť to o čo sa snažím? Teda synchrónne počkať na asynchrónnu funkciu?
2.5.2017 05:19 Jardík
Rozbalit Rozbalit vše Re: node.js a získanie premennej z callback funkcie
Ten sleep je implementovaný špatně, takhle ti to bude žrát 100% CPU. Měl bys vytvořit timer a čekat na něčem jako timeout (nevím, jak je to v node.js). Navíc je potřeba čekat na obě věci na jednou, jak timeout, tak stav socketu, jinak čekáním na socket rozbiješ svůj časovač.

Jinak na async fci čekáš tím await a to ti přece vrátí hodnotu, tak v čem je vlastně problém? Akorát, jestli to dobře chápu z toho článku linkovaného výše, tak tvoje toplevel fce stále potřebuje čekat na promise, protože ta async není.
async function asyncFce()
{
  vysledek1 = await nejakaFce();
  vysledek2 = await nejakaFce2(vysledek1);
  return vysledek2;
}

function topLevel()
{
  promise = new Promise(function asyncWrapper() { await asyncFce(); });
  promise.then(function zpracujVysledek(vysledek) { /* print vysledek */ } )
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.