Подождите, пока все скриншоты, прежде чем создавать PDF в NodeJS / Express - PullRequest
0 голосов
/ 17 января 2020

Мой код генерирует снимок экрана в al oop с:

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



function main(){
  for (const meter of meters) {
     makePngScreenshot(url, meterId, filename);
  }
}

Я хотел бы создать PDF после того, как все снимки экрана были сгенерированы, как я видел здесь :

const firstOperation = myAsyncFunction();
const secondOperation = myAsyncFunction2('test');
const thirdOperation = myAsyncFunction3(5);

await Promise.all([ firstOperation, secondOperation, thirdOperation ]);

Но когда я не могу найти способ заставить makePngScreenshot вернуть обещание, чтобы я мог добавить его в массив, и await с Promise.all:

Как мне это сделать?

1 Ответ

0 голосов
/ 17 января 2020

Используя async / await , вы можете использовать ключевое слово asyn c, чтобы заставить вашу функцию возвращать Promise по умолчанию:

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

makePngScreenshot теперь будет вернуть объект Promise.

И затем вы можете использовать await для ожидания результата функции,
либо один за другим:

async function main(){
  for (const meter of meters) {
     await makePngScreenshot(url, meter.meterId, meter.filename);
  }
}

(я предположил, что счетчик Объект имеет meterId и имя файла, это не ясно в вашем коде.)

или с Promise.all:

let promises = [];
async function main(){
  for (const meter of meters) {
     promises.push(makePngScreenshot(url, meter.meterId, meter.filename));
  }
 await Promise.all(promises);
}

Тест с:

main()
console.log("promises resolved");

Для Более подробное объяснение можно найти по ссылке, которую я разместил, MDN (Mozilla Developer Newtork) или в других источниках.

...