Это правда, что 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 вашей базы данных не возвращает обещания, но использует аргумент обратного вызова,затем сначала обещают соответствующий метод.