Как установить логическое значение для переменной внутри массива и проверить это значение с помощью узла JS? - PullRequest
0 голосов
/ 21 января 2019

Я хочу установить логическое значение "true" для переменной внутри флагов [].Затем, когда все переменные внутри флагов [] равны true, мне нужно выполнить операцию.

Пожалуйста, найдите мой код ниже.

var flags = [terminationFlag,transferFlag,jrCancelledFlag,jrFilledFlag,jrOpenFlag,miegFlags,headcountFlag,replacementReqFlag,costcentreFlag,gradeMapFlag]

var arguments = ["terminationReport - 2019-1", "transferReport - 2019-1", "jrCancelledReport - 2019-1", "jrFilledReport - 2019-1", "jrOpenReport - 2019-1","MIEGReport - 2019-1", "HeadCountReport - 2019-1","ReplacementReport - 2019-1","CostcentreReport - 2019-1","GradeMapReport - 2019-1"]

for (i=0; i < arguments.length ;i++){
    console.log("arguments : "+ arguments[i]);
    request('http://localhost:3000/query/CheckKey/'+arguments[i], function (error, response, body) {
        var result = JSON.stringify(response.body).replace(/[^a-zA-Z ]/g, "");
        if (result == "yes"){
            console.log("record found ****************");
            flags[i]=true;
            console.log("flags : "+ flags);
        }
       if flags = true {
           //do operation
        }
    });

} 

Но он не работает.Пожалуйста, помогите мне в решении этой проблемы.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вероятно, это связано с тем, что вы выполняете асинхронную операцию внутри цикла for.Поскольку вы не объявили i, он создается как глобальная переменная.Цикл for просто запускает запросы и не будет ждать выполнения обратных вызовов.Ко времени выполнения request значение i меняется на что-то другое, и в итоге вы присваиваете true неправильным flag элементам.Итак, измените его на:

arguments.forEach((arg, i) => {
  console.log("arguments : " + arg);
  request('http://localhost:3000/query/CheckKey/' + arg, function(error, response, body) {
    var result = JSON.stringify(response.body).replace(/[^a-zA-Z ]/g, "");
    if (result == "yes") {
      console.log("record found ****************");
      flags[i] = true;
      console.log("flags : " + flags);
    }
    if flags = true {
      //do operation
    }
  });
})

Или используйте let:

for (let i=0; i < arguments.length ;i++){

} 
0 голосов
/ 21 января 2019

Здесь 2 вопроса.

Во-первых, этот цикл for должен использовать let для итерации, особенно когда вы используете асинхронные функции внутри цикла, потому что каждая итерация будет содержать значение i для каждого цикла.

for (let i=0; i < arguments.length ;i++){

Второй,

if flags = true {
    //do operation
}

Вы должны использовать любую форму цикла, чтобы проверить, все ли флаги в массиве флагов верны. Вы можете использовать Array.every , как в ответе Джека Башфорда.

Я рекомендую обычный цикл for, поскольку он лучше по производительности.

let allFlagsTrue = true
for (let j = 0; j < flags.length; j++){
    if (flags[i] === false){
        allFlagsTrue = false
    }
}
if (allFlagsTrue){
    // Do your operations
}
0 голосов
/ 21 января 2019

Если вы хотите проверить, является ли каждый элемент в flags истинным, используйте Array.every():

if (flags.every(flag => flag)) {...}

Или, если ваш браузер не поддерживает ES6:

if (flags.every(function(flag) {
    return flag;
})) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...