Почему эти функции по-прежнему выполняются асинхронно, несмотря на использование модуля Async - PullRequest
1 голос
/ 27 июня 2019

Я решил использовать модуль Async для заполнения коллекции mongodb в том порядке, в котором я хочу.
Без Async код работает, но документы не вставляются в правильном порядке:

function insertRowInBLD(ref, riskstatements, maximpact, controleffectiveness, recommendedriskrating, frequency, impact, validatedreviewriskrating, rationalforriskadjustment) {
    const businessLineDashboard = new BusinessLineDashboard({
        ref: ref,
        riskstatements: riskstatements,
        maximpact: maximpact,
        controleffectiveness: controleffectiveness,
        recommendedriskrating: recommendedriskrating,
        frequency: frequency,
        impact: impact,
        validatedreviewriskrating: validatedreviewriskrating,
        rationalforriskadjustment: rationalforriskadjustment
    });
    businessLineDashboard.save()
        .then(row => {
            console.log('row ' + businessLineDashboard.ref + ' has been inserted succesfully');
        })
        .catch(err => {
            console.log('err: ', err);
        });
}

Я хотел, чтобы «документы» были вставлены в таком порядке. Из-за асинхронной природы JavaScript этого не произошло. Поэтому я попытался использовать

async.series:

function fillBLD() {


  async.series([
    function (callback) {
      console.log("Task 1");
      insertRowInBLD('R01', 'Disclosure of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 1 Inserted');
    },
    function (callback) {
      console.log("Task 2");
      insertRowInBLD('R02', 'Corruption of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 2 Inserted');
    },
    function (callback) {
      console.log("Task 3");
      insertRowInBLD('R03', 'Unavailability of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', '', '', '', '', '')
      callback(null, 'Row 3 Inserted');
    },
    function (callback) {
      console.log("Task 4");
      insertRowInBLD('R04', 'Disclosure of data due to attack of the communications link by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 4 Inserted');
    },
    function (callback) {
      console.log("Task 5");
      insertRowInBLD('R05', 'Corruption of data due to attack of the communications link by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 5 Inserted');
    },
    function (callback) {
      console.log("Task 6");
      insertRowInBLD('R06', 'Unavailability of data due to attack of the communications link by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 6 Inserted');
    },
    function (callback) {
      console.log("Task 7");
      insertRowInBLD('R07', 'Disclosure of data due to social engineering by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 7 Inserted');
    },
    function (callback) {
      console.log("Task 8");
      insertRowInBLD('R08', 'Corruption of data due to social engineering by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 8 Inserted');
    },
    function (callback) {
      console.log("Task 9");
      insertRowInBLD('R09', 'Unavailability of data due to social engineering by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 9 Inserted');
    },
    function (callback) {
      console.log("Task 10");
      insertRowInBLD('R10', 'Disclosure of data due to  erroneous useby internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 10 Inserted');
    },
    function (callback) {
      console.log("Task 11");
      insertRowInBLD('R11', 'Corruption of data due to erroneous useby internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 11 Inserted');
    },
    function (callback) {
      console.log("Task 12");
      insertRowInBLD('R12', 'Unavailability of data due to erroneous useby internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 12 Inserted');
    },
    function (callback) {
      console.log("Task 13");
      insertRowInBLD('R13', 'Disclosure of data due to  unauthorized access by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 13 Inserted');
    },
    function (callback) {
      console.log("Task 14");
      insertRowInBLD('R14', 'Corruption of data due to unauthorized access by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 14 Inserted');
    },
    function (callback) {
      console.log("Task 15");
      insertRowInBLD('R15', 'Unavailability of data due to unauthorized access by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 15 Inserted');
    },
    function (callback) {
      console.log("Task 16");
      insertRowInBLD('R16', 'Disclosure of data due to  attack by malicious code by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 16 Inserted');
    },
    function (callback) {
      console.log("Task 17");
      insertRowInBLD('R17', 'Corruption of data due to attack by malicious code by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 17 Inserted');
    },
    function (callback) {
      console.log("Task 18");
      insertRowInBLD('R18', 'Unavailability of data due to erroneous useby internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 18 Inserted');
    },
    function (callback) {
      console.log("Task 19");
      insertRowInBLD('R19', 'Disclosure of data due to improper change/maintenance by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 19 Inserted');
    },
    function (callback) {
      console.log("Task 20");
      insertRowInBLD('R20', 'Corruption of data due to improper change/maintenance by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 20 Inserted');
    },
    function (callback) {
      console.log("Task 21");
      insertRowInBLD('R21', 'Unavailability of data due to improper change/maintenance by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 21 Inserted');
    },
    function (callback) {
      console.log("Task 22");
      insertRowInBLD('R22', 'Disclosure of data due to loss or theft of device by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 22 Inserted');
    },
    function (callback) {
      console.log("Task 23");
      insertRowInBLD('R23', 'Unavailability of data due to loss or theft of device by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 23 Inserted');
    },
    function (callback) {
      console.log("Task 24");
      callback(null, 'Row 24 Inserted');
    },
    function (callback) {
      console.log("Task 25");
      insertRowInBLD('R25', 'Corruption of data due to bypassing physical security by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')

      callback(null, 'Row 25 Inserted');
    },
    function (callback) {
      console.log("Task 26");
      insertRowInBLD('R26', 'Unavailability of data due to bypassing physical security by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 26 Inserted');
    },
    function (callback) {
      console.log("Task 27");
      insertRowInBLD('R27', 'Disclosure of data due to third-party security breach by external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 27 Inserted');
    },
    function (callback) {
      console.log("Task 28");
      insertRowInBLD('R28', 'Corruption of data due to  third-party security breach by external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 28 Inserted');
    },
    function (callback) {
      console.log("Task 29");
      insertRowInBLD('R29', 'Unavailability of data due to third-party security breach by external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 29 Inserted');
    },
    function (callback) {
      console.log("Task 30");
      insertRowInBLD('R30', 'Disclosure of data due to unmanaged legal, regulatory and contractual requirements by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 30 Inserted');
    },
    function (callback) {
      console.log("Task 31");
      insertRowInBLD('R31', 'Corruption of data due to unmanaged legal, regulatory and contractual requirements by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 31 Inserted');
    },
    function (callback) {
      console.log("Task 32");
      insertRowInBLD('R32', 'Unavailability of data due to unmanaged legal, regulatory and contractual requirements by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')

      callback(null, 'Row 32 Inserted');
    },
    function (callback) {
      console.log("Task 33");
      callback(null, 'Row 33 Inserted');
    },
    function (callback) {
      console.log("Task 33");
      insertRowInBLD('R33', 'Unavailability of data due to component failure by internal/external factor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')

      callback(null, 'Row 33 Inserted');
    },
    function (callback) {
      console.log("Task 34");
      insertRowInBLD('R34', 'Unavailability of data due to exhaustion of resources by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 34 Inserted');
    },
    function (callback) {
      console.log("Task 35");
      insertRowInBLD('R35', 'Unavailability of data due to environmental & natural disasters by external factor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')

      callback(null, 'Row 35 Inserted');
    },
    function (callback) {
      console.log("Task 36");
      insertRowInBLD('R36', 'Lack of accountability due to tampering with audit trails by internal/external actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
      callback(null, 'Row 36 Inserted');
    },
  ], function (error, results) {
    console.log(results);
  });
}

Однако, хотя журналы консоли выполняются синхронно и результаты передаются в функции обратного вызова:

Задача 1 Задача 2 Задача 3 Задача 4 Задача 5 Задача 6 Задача 7 Задача 8 Задача 9 Задача 10 Задача 11 Задача 12 Задача 13 Задача 14 Задача 15 Задача 16 Задача 17 Задача 18 Задача 19 Задача 20 Задача 21 Задача 22 Задача 23 Задача 24 Задача 25 Задача 26 Задача 27 Задача 28 Задача 29 Задача 30 Задача 31 Задача 32 Задача 33 Задача 33 Задача 34 Задача 35 Задание 36 [«Вставлена ​​строка 1», «Вставлена ​​строка 2», «Вставлена ​​строка 3», «Строка 4 вставлена», «Строка 5 вставлена», «Строка 6 вставлена», «Строка 7» Вставлено ',' Строка 8 вставлена ​​',' Строка 9 вставлена ​​',' Строка 10 Вставлено ',' Строка 11 вставлена ​​',' Строка 12 вставлена ​​',' Строка 13 Вставлено »,« Строка 14 вставлена ​​»,« Строка 15 вставлено »,« Строка 16 Вставлено »,« Строка 17 вставлено »,« Строка 18 вставлено »,« Строка 19 Вставлено ',' Строка 20 вставлена ​​',' Строка 21 вставлена ​​',' Строка 22 Вставлено ',' строка 23 вставлена ​​',' строка 24 вставлена ​​',' строка 25 Вставлено »,« Строка 26 вставлено »,« Строка 27 вставлено »,« Строка 28 Вставлено ',' Строка 29 вставлена ​​',' Строка 30 вставлено ',' Строка 31 Вставлено »,« Строка 32 вставлено »,« Строка 33 вставлено »,« Строка 33 Вставлено »,« Строка 34 вставлено »,« Строка 35 вставлено »,« Строка 36 Вставлено ']

Функции insertRowInBLD по-прежнему не выполняются в указанном мной порядке:

строка R01 успешно вставлена строка R02 была вставлена строка R03 успешно вставлена успешно вставлена ​​строка R05 успешно вставлена ​​строка R07 была успешно вставлена ​​строка R08 была успешно вставлена ​​строка R09 успешно вставлена ​​строка R06 была вставлена строка R12 успешно вставлена ​​строка R19 успешно вставлена успешно вставлена ​​строка R14 успешно вставлена ​​строка R17 успешно вставлен ряд R22 успешно вставлен ряд R28 был успешно вставлен успешно вставлен ряд R25 успешно вставлен ряд R30 успешно вставлен ряд R35 успешно вставлен ряд R10 имеет успешно вставлен ряд R15 успешно вставлен ряд R20 был успешно вставлен строка R31 успешно вставлена ​​строка R36 успешно вставлена успешно вставлена ​​строка R11 успешно вставлена ​​строка R16 имеет была успешно вставлена ​​строка R21 была успешно вставлена ​​строка R27 был успешно вставлен успешно вставлен ряд R13 успешно вставлен ряд R18 успешно вставлена ​​строка R23 успешно вставлена ​​строка R29 имеет успешно вставлена ​​строка R34 успешно вставлена ​​

Я действительно не понимаю, почему они все еще выполняются асинхронно. Любая идея, что может быть причиной этого и как я могу это исправить?
Спасибо!

1 Ответ

3 голосов
/ 27 июня 2019

Вы в настоящее время вызываете обратные вызовы немедленно, а не ждете завершения вставки.Это означает, что вы немедленно запустите все сохранения и не сможете контролировать их окончание.Вместо этого вы хотите дождаться завершения одного, прежде чем переходить к следующему, и для этого вам нужно будет использовать обещание, созданное businessLaneDashboard.save ().В частности, вам нужно вернуть его из insertRowInBLD:

function insertRowInBLD(/* args */) {
    const businessLineDashboard = new BusinessLineDashboard(
      //etc
    );
    return businessLineDashboard.save();
}

С обещанием вы можете использовать его метод .then для ожидания перед вызовом обратного вызова.

    function (callback) {
      console.log("Task 1");
      insertRowInBLD('R01', 'Disclosure of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
        .then(() => callback(null, 'Row 1 Inserted'));
    },

Хотя теперь этомы используем обещания, я бы отбросил материал async.series и просто использовал цепочку обещаний, например:

insertRowInBLD('R01', 'Disclosure of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
  .then(() => {
    return insertRowInBLD('R02', 'Corruption of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '')
  })
  .then(() => {
    return insertRowInBLD('R03', 'Unavailability of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', '', '', '', '', '')
  })
  // etc

Если для вас есть вариант async / await, тогда работайте с обещаниямиможно сделать еще проще:

async function fillBLD() {
  await insertRowInBLD('R01', 'Disclosure of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '');
  await insertRowInBLD('R02', 'Corruption of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', 'Low', '', '', '', '');
  await insertRowInBLD('R03', 'Unavailability of data due to deliberate action by internal actor', 'E. Not significant', 'Partially effective', '', '', '', '', '');
  // etc
}
...