Как использовать обещания в ExcelJS - PullRequest
0 голосов
/ 04 марта 2019

У меня есть узел API, который получает файл xlsx.Он извлекает записи из этого файла и записывает их в базу данных.

в некоторых случаях данные не будут записываться в базу данных из-за отсутствия связанных данных.Я хочу перехватить все эти ошибки, прежде чем вернуть результаты обратно пользователю, поэтому мне нужно использовать обещание.

Вот как документы показывают worksheet.eachRow должно работать

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});

в документах также говорится, что в exceljs есть встроенные обещания узлов excelJS Promises , но следующий код не работает

worksheet.eachRow(function(row, rowNumber) {
        console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
}).then((result)=>{
  console.log("Done")
})

Я получаю ошибку Cannot read property 'then' of undefined

1 Ответ

0 голосов
/ 04 марта 2019

Это правда, что exceljs поддерживает обещания, но это относится только к асинхронным задачам, таким как файловый ввод / вывод.

Итерация строк в рабочем листе выполняется синхронно , что означает, что функция обратного вызова для eachRow выполняется немедленно для каждой строки, и только после выполнения этих обратных вызовов будет вызываться eachRowполный.

eachRow возвращает undefined, и нет смысла заставлять его возвращать обещание, поскольку оно синхронно по своей природе.

Теперь это становится другой историей, если для каждой строкивы планируете выполнить асинхронную задачу , например, чтобы вставить что-то в базу данных.

Допустим, вы хотите вызвать метод db.insert(row), который возвращает обещание, тогда у вас будет однообещание за строку.Если вы собираете эти обещания в массив, вы можете выполнить стандартный вызов Promise.all, чтобы получить общий обещанный результат:

const promises = [];
worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
    const promise = db.insert(row); // <-- whatever async operation you have here
    promises.push(promise);
});

Promise.all(promises).then((result)=>{
    console.log("Done")
}).catch((err) => {
    console.log("An error occurred while inserting data", err);
});

Если API вашей базы данных не возвращает обещания, но использует аргумент обратного вызова,затем сначала обещают соответствующий метод.

...