помните о конце al oop потоков в NodeJS - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно сгенерировать изображения в моем приложении NodeJS, используя Pageres

Я делаю это на al oop. Итак, у меня есть 2 варианта:

Вариант 1:

async function makePngScreenshot(url, meterId, filename) {
    axios.get(url, null); // Make the request to generate html page
    await new Pageres({delay: 2, filename: filename})
        .src(url, ['1300x650'], {crop: true})
        .dest("public/images/" + operation.data.name + "/" + yearAndMonthFolder + "/" + meterId
        )
        .run();
}

И затем вызовите его:

for (let firstDay = monday; firstDay < lastDay; firstDay.add(7, "day")) {
    await makePngScreenshot(url, id, filename);
}

Этот метод хорош, но он очень медленный, так как он генерирует скриншоты один за другим.

Вариант 2:

Второй метод, предназначенный для генерации скриншотов с одновременным использованием:

function makePngScreenshot(url, meterId, filename) {
    axios.get(url, null); // Make the request to generate html page
    (async () => { // Make screenshot
        await new Pageres({delay: 2, filename: filename})
            .src(url, ['1300x650'], {crop: true})
            .dest("public/images/" + operation.data.name + "/" + yearAndMonthFolder + "/" + meterId
            )
            .run();
    })();
}

И вызывает его:

for (let firstDay = monday; firstDay < lastDay; firstDay.add(7, "day")) {
        makePngScreenshot(url, id, filename);
    }
console.log("done")

Этот метод намного быстрее, и я хотел бы его использовать, но я не знаю, как напечатать done после создания всех снимков экрана, прямо сейчас он печатается до генерации.

Как можно узнать об окончании всех потоков?

1 Ответ

1 голос
/ 29 мая 2020

Вы можете использовать Promise.all () для этой цели. Вам нужно будет вернуть Promise из makePngScreenShot, что является незначительной модификацией, а также вызвать makePngScreenShot из функции asyn c.

Это будет выглядеть примерно так:

async function makePngScreenshot(url, meterId, filename) {
    await axios.get(url, null); // Make the request to generate html page
    return new Pageres({delay: 2, filename: filename})
        .src(url, ['1300x650'], {crop: true})
        .dest("public/images/" + operation.data.name + "/" + yearAndMonthFolder + "/" + meterId
        )
        .run();
}

async function makeScreenshots() {
    let promises = []; 
    for (let firstDay = monday; firstDay < lastDay; firstDay.add(7, "day")) {
        promises.push(makePngScreenshot(url, id, filename));
    }
    // Wait for all promises to resolve
    await Promise.all(promises);
    console.log("done")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...