Node.js 节点脚本在进入下一个迭代之前等待套接字事件触发

Node.js 节点脚本在进入下一个迭代之前等待套接字事件触发,node.js,promise,Node.js,Promise,具有以下返回的节点脚本 但假装的是得到: 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 按那个命令。强制foreach在继续下一次迭代之前等待触发事件 var net = require('net'); var client = new net.Socket(); const fs = require('fs'); var serverPingList = [ { port:'80', domain:'d

具有以下返回的节点脚本

但假装的是得到: 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合

按那个命令。强制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...')

    //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.');
        });
        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();
    });
  });
}

它的行为是这样的,因为在这种情况下,您使用异步编程。也许下面的例子可以更清楚地说明这一点

x=新承诺((res,rej)=>{
控制台日志(“a”);
res();
控制台日志(“b”);
})
x、 然后(()=>console.log(“c”);
控制台日志(“d”);
//a
//b
//d

//c
它的行为是这样的,因为在这种情况下,您使用异步编程。也许下面的例子可以更清楚地说明这一点

x=新承诺((res,rej)=>{
控制台日志(“a”);
res();
控制台日志(“b”);
})
x、 然后(()=>console.log(“c”);
控制台日志(“d”);
//a
//b
//d

//c
本能地,我会删除承诺,并使用该功能来链接您的ping

以下是根据您的代码改编的未经测试的代码片段:

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();
  });
}

本能地,我会取消承诺,并使用该功能来链接您的ping

以下是根据您的代码改编的未经测试的代码片段:

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();
  });
}

当承诺为resolve或reject时,停止使用forEach,只使用数组的pop方法再次调用函数,以便在下一次迭代中使用(必须有更好的方法,但现在…)。感谢@Nikita Malyschkin和@MadWard提供的答案,但回拨使我对@MadWard解决方案有点困惑,没有返回关于@Nikita答案的假设,这是我的一点问题。。。如何使用promise强制foreach循环同步(因为节点是异步的)


当承诺为resolve或reject时,停止使用forEach,只使用数组的pop方法再次调用函数,以便在下一次迭代中使用(必须有更好的方法,但现在…)。感谢@Nikita Malyschkin和@MadWard提供的答案,但回拨使我对@MadWard解决方案有点困惑,没有返回关于@Nikita答案的假设,这是我的一点问题。。。如何使用promise强制foreach循环同步(因为节点是异步的)