Node.js 节点脚本在进入下一个迭代之前等待套接字事件触发
具有以下返回的节点脚本 但假装的是得到: 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 连接。。。 成功 插座闭合 按那个命令。强制foreach在继续下一次迭代之前等待触发事件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
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循环同步(因为节点是异步的)