Почему мое обещание заканчивается, когда выполняется один раз, но не в цикле? - PullRequest
0 голосов
/ 23 сентября 2019

Я делаю проект для развлечения, где я рисую на холсте в узле, используя pureimage, а затем записываю каждый кадр анимации в отдельный файл png.

Если я запускаю приведенный ниже код один раз, он работает как положено и создает один файл PNG.

Если я помещаю его в цикл, обещание никогда не заканчивается.Я думаю, что существующий процесс останавливается и перезапускается, потому что, если я остановлю программу, PNG будет поврежден.

Итак, мой вопрос: как я могу выполнить несколько обещаний в цикле, и где я могу узнать больше об этой проблеме?

PI.encodePNGToStream(img, fs.createWriteStream('img' + counter + '.png') ).then( function(){

  console.log("Wrote out file")

  counter = counter + 1

  console.log(counter)

}).catch( function() { 

  console.log("Error writing file")

})

1 Ответ

3 голосов
/ 23 сентября 2019

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

Что вы можете сделать, это использовать функцию асинхронности / ожидания, но вам нужно обернуть его внутри функции с ключевым словом async, прежде чем это так:

async function test() {
    try {
        for(let counter = 1; counter < 10; counter++ ) {
            await PI.encodePNGToStream(img, fs.createWriteStream('img' + counter + '.png') );
            console.log("Wrote out file");
            console.log(counter);
        }
    } catch(e) {
       console.log(e.message);
    }
}

Для получения дополнительной информации проверьте следующие ссылки:

  1. https://javascript.info/callbacks
  2. https://javascript.info/promise-basics
  3. https://javascript.info/async-await
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...