Сценарий Node ожидает запуска события сокета, прежде чем перейти к следующей итерации - PullRequest
0 голосов
/ 16 января 2019

Имеется следующий скрипт узла, который возвращает

enter image description here

но то, что притворилось, было: Подключение ... успех розетка закрыта Подключение ... успех розетка закрыта Подключение ... успех розетка закрыта Подключение ... успех розетка закрыта

по этому приказу. Заставить foreach подождать, пока события сработают, прежде чем перейти к следующей итерации.

var net = require('net');
var client = new net.Socket();
const fs = require('fs');


var serverPingList = [
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'8089',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
]

serverPingList.forEach(function(server){

  pingPlatforms(server).then(function(result){
     console.log(result);
  }, function(err){
     console.log(err);
  });

})

function pingPlatforms(server){
  return new Promise(function(resolve, reject){
    var logInit = `server ${server.domain} and port ${server.port} Connecting...`
    var log;
    fs.appendFile('ping.log', logInit + '\n', (err) => {
        if(err)
          console.log('Unable to append to server.log.');
    });

    //console.log(server.port);
    //console.log(server.domain);
    console.log('Connecting...')

    ///7909492/node-js-sobytie-socket-io-client-connectfailed-connecterror
    //https://nodejs.org/api/net.html#net_socket_connect
    var socket = client.connect(server.port, server.domain);
    //var socket = ns_news.socket;

    //the ping failed
    socket.on('error', function(){
        var now = new Date().toString();
        log = `${now}: server ${server.domain} and port ${server.port} Connection Failed`;
        fs.appendFile('ping.log', log + '\n', (err) => {
            if(err)
              console.log('Unable to append to ping.log.');
        });
        resolve('success');
        //client.destroy();
    });
    // the ping is successful
    socket.on('connect', function(){
        console.log('Connected');

        var now = new Date().toString();
        log = `${now}: server ${server.domain} and port ${server.port} Connection Successful`;
        fs.appendFile('ping.log', log + '\n', (err) => {
            if(err)
              console.log('Unable to append to ping.log.');
        });
        resolve('success');
        //client.destroy();
    });

    socket.on('disconnect', function () {
      console.log('Disconnected');
      reject('disconnected');
    });
    socket.on('close', function () {
      console.log('socket closed');
      //client.destroy();
    });
  });
}

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Инстинктивно я удалил бы обещания и использовал бы функцию async.eachSeries , чтобы связать ваши пинги.

Вот непроверенный фрагмент, адаптированный из вашего кода:

var net = require('net');
var client = new net.Socket();
const fs = require('fs');
const async = require("async");

var serverPingList = [
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'8089',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
]

async.eachSeries(serverPingList, function(server, callback){

  pingPlatforms(server, function(err){
    if(err){
      console.log("Error on pinging server", server.domain, err);
    }else{
      console.log("Success on pinging server",server.domain);
    }
    return callback();
  });
}, function(){
  console.log("All pings have been sent");
});

function pingPlatforms(server, cb){
  var logInit = `server ${server.domain} and port ${server.port} Connecting...`
  var log;
  fs.appendFile('ping.log', logInit + '\n', (err) => {
      if(err)
        console.log('Unable to append to server.log.');
  });

  //console.log(server.port);
  //console.log(server.domain);
  console.log('Connecting...')

  ///7909492/node-js-sobytie-socket-io-client-connectfailed-connecterror
  //https://nodejs.org/api/net.html#net_socket_connect
  var socket = client.connect(server.port, server.domain);
  //var socket = ns_news.socket;

  //the ping failed
  socket.on('error', function(){
      var now = new Date().toString();
      log = `${now}: server ${server.domain} and port ${server.port} Connection Failed`;
      fs.appendFile('ping.log', log + '\n', (err) => {
          if(err)
            console.log('Unable to append to ping.log.');
      });
      cb(null);
      //client.destroy();
  });
  // the ping is successful
  socket.on('connect', function(){
      console.log('Connected');

      var now = new Date().toString();
      log = `${now}: server ${server.domain} and port ${server.port} Connection Successful`;
      fs.appendFile('ping.log', log + '\n', (err) => {
          if(err)
            console.log('Unable to append to ping.log.');
      });
      cb(null);
      //client.destroy();
  });

  socket.on('disconnect', function () {
    console.log('Disconnected');
    cb("Error");
  });
  socket.on('close', function () {
    console.log('socket closed');
    //client.destroy();
  });
}
0 голосов
/ 16 января 2019

Должен работать как задумано, прекратив использовать forEach, используя только метод pop массива, вызывающий функцию снова для следующей итерации, когда обещание было разрешено или отклонено (должен быть лучший способ сделать это, но пока ..) .) Спасибо @Nikita Malyschkin и @MadWard за ответы, но обратный вызов сделал меня немного запутанным для решения @MadWard и не вернул то, что предполагалось, что касается ответа @Nikita, который был немного моим вопросом ... как использовать обещание принудительно синхронизировать цикл foreach (поскольку узел асинхронный).

var net = require('net');
const fs = require('fs');
const async = require("async");

var serverPingList = [
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'8089',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
  {
    port:'80',
    domain:'domainexample'
  },
]

pingAll();


function pingAll(){
  var server = serverPingList.pop();
  var client = new net.Socket();
  pingPlatforms(server,client)
  .then(function(result){
     console.log(result);
     if(serverPingList.length>0)
        pingAll();
  }, function(err){
     console.log(err);
     if(serverPingList.length>0)
        pingAll();
  });
}


function pingPlatforms(server,client){
  return new Promise(function(resolve, reject){
    var logInit = `server ${server.domain} and port ${server.port} Connecting...`
    var log;
    fs.appendFile('ping.log', logInit + '\r\n', (err) => {
        if(err)
          console.log('Unable to append to server.log.');
    });

    //console.log(server.port);
    //console.log(server.domain);


    ///7909492/node-js-sobytie-socket-io-client-connectfailed-connecterror
    //https://nodejs.org/api/net.html#net_socket_connect
    console.log('Connecting...')
    var socket = client.connect(server.port, server.domain);

    socketEvents(socket,client,server).then(function(result){
       resolve(result);
    }, function(err){
       reject(err)
    });


    /*
    socket.on('disconnect', function () {
      console.log('Disconnected');
      reject('disconnected');
    });
    */
    /*
    socket.on('close', function () {
      console.log('socket closed');
      //socket.disconnect(0);
      //client.destroy();
    });
    */

  });
}

function socketEvents(socket,client,server){
  return new Promise(function(resolve, reject){
    //the ping failed
    socket.on('error', function(){
        var now = new Date().toString();
        log = `${now}: server ${server.domain} and port ${server.port} Connection Failed`;
        fs.appendFile('ping.log', log + '\r\n', (err) => {
            if(err)
              console.log('Unable to append to ping.log.');
        });
        client.destroy();
        reject(log);
    });
    // the ping is successful
    socket.on('connect', function(){
        console.log('Connected');

        var now = new Date().toString();
        log = `${now}: server ${server.domain} and port ${server.port} Connection Successful`;
        fs.appendFile('ping.log', log + '\r\n', (err) => {
            if(err)
              console.log('Unable to append to ping.log.');
        });
        client.destroy();
        resolve('success');
    });
  });
}
0 голосов
/ 16 января 2019

Это ведет себя так, потому что вы используете асинхронное программирование, в этом случае Promises. Возможно, приведенный ниже пример может прояснить ситуацию.

x = new Promise((res,rej) => {
  console.log("a");
  res();
  console.log("b");
})
x.then(() => console.log("c"));
console.log("d");
// a
// b
// d
// c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...