Код NodeJS не ожидает завершения функции - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю файл Excel с функцией Lambda, который позже отправляется по электронной почте.Excel заполняется данными раньше и затем сохраняется следующим образом (с пакетом excel4node nom):

console.log("Before print");
    var test2 = await workbook.write(path, function(err, stats) {
        console.log("Excel written");
        if (err) {
          console.error(err);
        } else {
          console.log(stats); // Prints out an instance of a node.js fs.Stats object

        }
      });
    console.log("After print");

Код иногда работает.Проблема заключается в следующем коде не ждет, пока Excel будет написан и электронная почта не может найти вложение.

Как я могу заставить мою функцию Lambda ждать, пока Excel записывается на диск?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я предлагаю поместить код электронной почты в обратный вызов, в блок else.

0 голосов
/ 16 ноября 2018

await работает только с функциями, которые возвращают обещание, которое разрешается после завершения базовой асинхронной операции. Поскольку вы передаете функцию обратного вызова в стиле завершения, она, вероятно, не возвращает такое обещание.

Если используемая вами библиотека напрямую не поддерживает обещания, вы можете выполнить функцию обещания самостоятельно.

const util = require('util');
workbook.writeP = util.promisify(workbook.write);

async function someFunc() {
    try {
        let result = await workbook.writeP(path);
        console.log(result);
        // do something here that runs after the .write operation is done
    } catch(e) {
        console.log(e);
    }
}
...