Сценарий Node ожидает запуска события сокета, прежде чем перейти к следующей итерации

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

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

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

0
задан H.C 16 January 2019 в 10:48
поделиться

3 ответа

Инстинктивно я удалил бы обещания и использовал бы функцию 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...')

  //https://stackoverflow.com/questions/8588689/node-js-socket-io-client-connect-failed-connect-error-event
  //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
ответ дан MadWard 16 January 2019 в 10:48
поделиться

Пришлось работать по назначению, прекратив использовать 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);


    //https://stackoverflow.com/questions/8588689/node-js-socket-io-client-connect-failed-connect-error-event
    //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
ответ дан H.C 16 January 2019 в 10:48
поделиться

Это ведет себя так, потому что вы используете асинхронное программирование, в этом случае 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

0
ответ дан Nikita Malyschkin 16 January 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: