Невозможно обновить глобальные переменные из внутреннего обратного вызова, которые связаны в несколько функций. Есть ли какой-нибудь способ обновить то же самое?

#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. Избавьтесь от спагетти или не полагайтесь на глобалы? Трудно сказать-это слишком много кода, чтобы пытаться рассуждать о нем.