#javascript #node.js #asynchronous #nodes #aws-sdk
Вопрос:
Я пытаюсь обновить 2 глобальных из обратных вызовов, которые находятся внутри обратного вызова другой функции. Если вы видите код. Я пытаюсь обновить количество и пометить переменные из обратного вызова внутри функции executeJMX. Эта функция executeJMX вызывается из функции changeJMX. Эта функция changeJMX вызывается из функции checkSQS, которая вызывается из основной функции. Эта идея заключается в том, что после завершения конвейера переходите к следующей итерации. Но переменная flag и count никогда не обновляется. Код отлично работает для 1-й итерации, но терпит неудачу на 2-й итерации и далее.
const fs = require('fs')
const path = require('path')
count = 1;
flag = false;
function main() {
while (count <= 30) {
if (!flag) {
flag = true;
checkSQS();
} else {
continue;
}
}
}
// checkSQS();
function checkSQS() {
let res;
const AWS = require('aws-sdk');
const { region, endpoint, accessId, accessPassword } = require('./config');
var sqs = new AWS.SQS({ region: region, accessKeyId: accessId, secretAccessKey: accessPassword, endpoint: endpoint });
const params = {
QueueUrl: endpoint, /* required */
AttributeNames: [
'All'
]
};
sqs.getQueueAttributes(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
res = JSON.parse(data.Attributes.ApproximateNumberOfMessages) JSON.parse(data.Attributes.ApproximateNumberOfMessagesNotVisible) JSON.parse(data.Attributes.ApproximateNumberOfMessagesDelayed);
// console.log(JSON.parse(data.Attributes.ApproximateNumberOfMessages) JSON.parse(data.Attributes.ApproximateNumberOfMessagesNotVisible) JSON.parse(data.Attributes.ApproximateNumberOfMessagesDelayed));
if (res === 0) {
setTimeout(() => {
changeJMX()
}, 90000);
}
}
});
}
function changeJMX() {
let data = fs.readFileSync('xyz.jmx', 'utf8');
let result = data.replace(/<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="[0-9]{1,2}.csv" enabled="true">/g, `<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="${count}.csv" enabled="true">`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
data = fs.readFileSync('xyz.jmx', 'utf8');
result = data.replace(/<stringProp name="filename">/temp/jmeter/jm/set/[0-9]{1,2}.csv</stringProp>/g, `<stringProp name="filename">/temp/jmeter/jm/set/${count}.csv</stringProp>`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
data = fs.readFileSync('xyz.jmx', 'utf8');
result = data.replace(/<stringProp name="filename">/temp/jmeter/jm/set/results/T[0-9]{1,2}_single_resultsTree_push.xml</stringProp>/g, `<stringProp name="filename">/temp/jmeter/jm/set/results/T${count}_single_resultsTree_push.xml</stringProp>`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
data = fs.readFileSync('xyz.jmx', 'utf8');
result = data.replace(/<stringProp name="filename">/temp/jmeter/jm/set/results/T[0-9]{1,2}_single_resultsSummary_push.xml</stringProp>/g, `<stringProp name="filename">/temp/jmeter/jm/set/results/T${count}_single_resultsSummary_push.xml</stringProp>`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
data = fs.readFileSync('xyz.jmx', 'utf8');
result = data.replace(/<stringProp name="filename">/temp/jmeter/jm/set/results/T[0-9]{1,2}_single_resultsAggregate_push.xml</stringProp>/g, `<stringProp name="filename">/temp/jmeter/jm/set/results/T${count}_single_resultsAggregate_push.xml</stringProp>`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
data = fs.readFileSync('xyz.jmx', 'utf8');
result = data.replace(/<stringProp name="filename">/temp/jmeter/jm/set/results/T[0-9]{1,2}_single_resultsGraph_push.xml</stringProp>/g, `<stringProp name="filename">/temp/jmeter/jm/set/results/T${count}_single_resultsGraph_push.xml</stringProp>`);
fs.writeFileSync('xyz.jmx', result, 'utf8');
executeJMX();
}
function executeJMX() {
const { NodeSSH } = require('node-ssh')
const ssh = new NodeSSH()
ssh.connect({
host: 'host',
username: 'steel',
privateKey: fs.readFileSync('./host', 'utf8'),
// readyTimeout: 1800000
}).then(function () {
let date = new Date();
console.log(`Run ${count} start time(India):`, date);
ssh.exec('/temp/jmeter/apache-jmeter/bin/jmeter', ['-n', '-t', 'xyz.jmx', '-l', `./set/results/T${count}_single_res.csv`, '-e', '-o', `./set/results/web/${count}`], {
cwd: '/temp/jmeter/jm',
onStdout(chunk) {
console.log('stdoutChunk', chunk.toString('utf8'));
if (chunk.toString('utf8').includes('end of run')) {
count ; // need to update this from this callback
flag = false; // need to update this from this callback
ssh.dispose();
}
},
onStderr(chunk) {
console.log('stderrChunk', chunk.toString('utf8'));
},
}).catch(function () {
});
});
}
main();
Комментарии:
1. Как только вы установите
flag
значениеtrue
, цикл while завершится. Что именно вы подразумеваете под «неудачной 2-й итерацией и далее»?checkSQS()
Насколько я могу судить, он никогда не звонит во второй раз.2. Да, извините за то, что я изменил код без флага в состоянии while(возможно, скопировал более ранний код). Счетчик и флаг не обновляются с помощью функции executeJMX.
3. Если выполняется код, изменяющий глобальные значения, то глобальные значения изменяются. Я подозреваю, что это больше связано с тем, когда они обновляются; здесь слишком много асинхронных спагетти для работы, но, скорее всего, это связано с упомянутыми асинхронными спагетти.
4. что можно сделать в этом случае?
5. Избавьтесь от спагетти или не полагайтесь на глобалы? Трудно сказать-это слишком много кода, чтобы пытаться рассуждать о нем.