дождитесь загрузки файлов перед созданием объекта - PullRequest
0 голосов
/ 22 октября 2018

В моем классе Session я создаю объекты моего класса Question.Там я загружаю изображения на локальный путь.Теперь проблема в том, что мой класс LaTeXDoc требует, чтобы все изображения уже были сохранены при вызове, но, тем не менее, файлы загружаются асинхронно, что приводит к тому, что файлы отсутствуют при необходимости.

Звонки моих классов

router.post('/upload', upload.single('session'),function(req, res) {
  var session_file = JSON.parse(fse.readFileSync(req.file.path, 'utf-8'));
  // Session creates the Question objects    
  var session = new Session(session_file);

  var tex = new LaTeXDoc(session); // files should already downloaded here
  ...

  res.sendFile(path.resolve("./tmp/"+tex.pdf_name));
});

Вопрос

const randomstring = require("randomstring");

var http = require('https');
var fs = require('fs');

class Question{
    constructor(type, variant, subject, text, possibleAnswers, hint, solution, imageURL){
        ...
        this.imageURL = imageURL
        this.imageName = randomstring.generate()+".png";

        var options = {
            url: this.imageURL,
            dest: './tmp/'+this.imageName
        }

        if (this.imageURL != null){
            var file = fs.createWriteStream(options.dest);
            var request = http.get(options.url, function(response) {
                response.pipe(file);
                console.log(file.path) // => /path/to/dest/image.jpg 
            });
        }
    }
}

Теперь, как мне убедиться, что файлыприсутствует, когда я создаю свой LaTeXDoc класс?

1 Ответ

0 голосов
/ 22 октября 2018

Вам нужно использовать обещания или обратные вызовы в вашем API, если вам нужно знать, когда они завершили асинхронные действия.Это означает, что вам нужно будет перенести асинхронные действия из конструкторов объектов в какой-то метод init.

ex

function init(cb) {
    http.get(options.url, function(response) {
        response.pipe(file);
        console.log(file.path) // => /path/to/dest/image.jpg 
        return cb();
    });
}
...