Как я могу заставить одну функцию запускаться только после записи файла? (node.js с помощью excel.js библиотека)

#node.js #excel #asynchronous

#node.js #excel #асинхронный

Вопрос:

МОЙ файл записывается в функцию convertfile() после активации formatworkbook(), следовательно, выдает ошибку, поскольку переменная xlsxWorkbook не существует до тех пор, пока мы не конвертируем файл. Я новичок в async-await и promises, но я попытался сделать это асинхронным (используя оба)

Пара вещей, которые я пробовал:

1) Пытаюсь настроить ее так, чтобы она возвращала записанный файл в результате выполнения обещания (которое с помощью .затем ключевое слово (я все еще думаю, что делаю немного), а затем указывающее format workbook ожидать convertFile (объявляя его как асинхронную функцию)

2) Вызов formatWorkbook в convertFile() после инструкции then .

 var express = require('express');
var router = express.Router();
const multer = require('multer');
var Excel = require('exceljs');
const index = require("../routes/index")
const path = require('path')
const fs = require('fs')

var workbook = new Excel.Workbook();

//var myworkbook = workbook.csv.readFile('uploads/HVACresultfile.csv')
// if no workbook await the file function should go here or something.


convertFile(workbook)



function convertFile(workbook) {
    var workbook = new Excel.Workbook();
    csvWorkbook = workbook.csv.readFile('uploads/HVACresultfile.csv')
    csvWorkbook.then(function(result){
    try {
    workbook.xlsx.writeFile('uploads/success.xlsx')
    console.log('converted')

    } catch(err){
    console.log(err)
    }
})

}

function formatWorkbook(workbook) {
    var workbook = new Excel.Workbook();
    var xlsxWorkbook = workbook.xlsx.readFile('uploads/success.xlsx')
    var xlsxWorksheet = workbook.getWorksheet('sheet1')

    xlsxWorkbook.then(function(result){
        try {
            assessFile(xlsxWorkbook,xlsxWorksheet)
            console.log('assessing')
        } catch(err) {
            console.log(err)
        }
    })
}

function assessFile(workbook,xlsxWorkbook,xlsxWorksheet) {
    console.log('burf')
}


formatWorkbook()
  

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

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

ps. success.xlsx правильно ли записывается CSV-файл в формате xlsx.

Ответ №1:

Поместите вызов convertFile(workbook) внутрь .тогда метод вашего formatWorkbook выглядит следующим образом:

 async function convertFile(workbook) {
    var workbook = new Excel.Workbook();
    csvWorkbook = workbook.csv.readFile('./products.xlsx')
    await csvWorkbook.then(async function(result){
        await workbook.xlsx.writeFile('./products2-teste-stack.xlsx').then( () => {
        console.log('converted')
        })

    })
}

function formatWorkbook(workbook) {
    var workbook = new Excel.Workbook();
    var xlsxWorkbook = workbook.xlsx.readFile('uploads/success.xlsx')
    var xlsxWorksheet = workbook.getWorksheet('sheet1')

    xlsxWorkbook.then(async function(result){
        try {
            // CALL CONVERT WHEN YOU FINISH READING YOUR FILE
            await convertFile(workbook)
            assessFile(xlsxWorkbook,xlsxWorksheet)
            console.log('assessing')
        } catch(err) {
            console.log(err)
        }
    })
}
  

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

Комментарии:

1. Поток операций, если это 1) CSV загружен 2) CSV должен быть преобразован в XLSX 3) Я применяю стили и т.д. 4) XLSX записывается с изменениями. как бы то ни было, ‘uploads / HVACresultfile.csv’ будет существовать, но ‘uploads/success.xlsx ‘не будет, пока не запустится convertFile() . Я ДУМАЮ, что ваш ответ по-прежнему правильный, я просто хотел убедиться, потому что я не уверен, что я просто не получу ошибку, когда мы нажмем formatWorkbook ()

2. О, НЕВАЖНО, я думаю, что теперь понимаю

3. Await convertfile () будет ожидать результата полного преобразования файла, чтобы XLSX мог существовать. может быть, было бы лучше объявить рабочую книгу XLSX после инструкции try?

4. Нет проблем, Джейсон!! Я добавляю асинхронность к вашей функции, чтобы вы могли использовать ожидание в своем обещании.

5. Я исправляю место асинхронной функции! Она должна быть внутри вашего . тогда метод, ок!

Ответ №2:

Вы также можете сделать это следующим образом:

 workbook.xlsx.readFile('uploads/success.xlsx').then(async function() {
    try {
        var xlsxWorksheet = workbook.getWorksheet('sheet1')
        await convertFile(xlsxWorksheet)
        assessFile(xlsxWorkbook,xlsxWorksheet)
        console.log('assessing')
    } catch(err) {
        console.log(err)
    }
})