为什么我的承诺在运行一次但不循环时结束?



我正在做一个有趣的项目,我使用 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")
})

当您在循环中添加代码时,我想您希望它同步工作,对吗?但问题是,承诺本质上是异步的。then中的代码在解析承诺时运行。

你可以做的是使用 async/await 功能,但你需要在它之前用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

最新更新